Skip to main content
Glama

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).

Related MCP server: upv-mcp

Установка и запуск

Нужен аккаунт ВШЭ. Каждый пользователь ставит сервер у себя со своими данными.

Claude Desktop — без терминала

  1. Скачайте hse-mcp-<версия>.mcpb из последнего релиза.

  2. Откройте файл двойным щелчком (или перетащите в окно Claude Desktop, или Настройки → Расширения → Дополнительно → Установить расширение…).

  3. Введите 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; тесты не ходят в сеть и не читают учётные данные).

Учётные данные

Пароль ищется по порядку, берётся первый найденный:

  1. переменная окружения процесса HSE_PASSWORD (в том числе заданная клиентом MCP);

  2. системное хранилище: Windows Credential Manager, macOS Keychain, Linux Secret Service (служба hse-mcp, учётная запись — значение HSE_EMAIL), через необязательную зависимость @napi-rs/keyring;

  3. 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 и не повторяйте заказ без этой проверки. Новый источник проверки вживую с заказом ещё не проверялся.

Как пользоваться:

  1. Сначала сухой прогон. Вызов без confirm ничего не отправляет: он читает страницу задания (для справки — форму) и показывает, что будет добавлено и заменено, предупреждения и previewToken.

  2. Запись — тот же вызов с confirm: true и previewToken из сухого прогона. Токен действует 15 минут, одноразовый и привязан к заданию, режиму, файлам (по содержимому) и состоянию ответа: если что-то изменилось, нужен новый сухой прогон.

  3. Не добавляйте тулы записи в автоматические разрешения клиента (в Claude Desktop — не выбирайте для них «Разрешать всегда»). Защита от случайной отправки держится на запросе разрешения клиента MCP перед каждым вызовом: сервер не может проверить, что человек на месте.

  4. Исход проверяется чтением и бывает трёх видов: confirmed (подтверждено), rejected (система отказала, состояние не изменилось), unknown (проверить не удалось). После unknown не повторяйте отправку: откройте задание на сайте (для справки — страницу «Заявки» в lk.hse.ru) и посмотрите, что там на самом деле. Повторный вызов с тем же previewToken ничего не отправляет: для заданий он перепроверит результат чтением, а для справки не перепроверяет, а возвращает unknown с подсказкой сверить вручную. Новая запись по этой цели потребует acknowledgeUnknown: true. Для заказа справки rejected не выносится никогда.

  5. Сохранение может сразу отправить работу на оценку: у заданий без отдельного шага «Отправить на оценку» draft этого не исключает. Шаг «Отправить на оценку» тул сам не выполняет. Просроченные и закрытые задания тул отклоняет.

Журнал записей лежит в writes/journal.json каталога данных (90 дней, не более 200 записей) и содержит только технические поля: без содержимого, имён файлов, названий и id курсов и заданий.

Как это устроено

  • SmartLMS и ЕЛК — общий Playwright-браузер (src/auth/browser-session.ts), который проходит единый SSO ВШЭ (Keycloak, saml.hse.ru, realm hse) и переиспользует сессию между вызовами (сохраняется в 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.

Лицензия

MIT

Available Tools

21 tools
elk_get_academic_dataАкадемическая карточка ЕЛКA
Read-onlyIdempotent

Структурированная академическая карточка студента (lk.hse.ru/api/get-academic-data): рейтинг, GPA, кредиты, КУД, программа обучения, факультет, курс, группа, форма и уровень обучения, статус. Структурированная замена разделу profile в elk_get_section.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description adds the underlying endpoint and the substitution relationship to elk_get_section, which is useful context, but says nothing about freshness, latency, error modes, or what happens when the student has no card.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads the resource with its endpoint and a dense field enumeration, the second delivers the sibling-routing instruction. No filler and nothing is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must carry the return-value burden, and the field enumeration does that well. Minor gap: terms like 'КУД' and the shape of nested data (per-semester vs aggregate GPA/credits) are not clarified, but for a zero-parameter read tool this is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. The description cannot be faulted for parameter semantics here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific resource (академическая карточка студента) and enumerates exactly what it contains — рейтинг, GPA, кредиты, программа, факультет, курс, группа, статус — so an agent knows precisely what it gets. It also explicitly distinguishes itself from the sibling elk_get_section by positioning itself as the structured replacement for its profile section.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The clause 'Структурированная замена разделу profile в elk_get_section' tells the agent to prefer this tool over elk_get_section for profile data, which is a genuine routing signal. It stops short of any explicit when-not condition or other alternatives, but the sibling relationship is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

elk_get_notificationsУведомления ЕЛКB
Read-onlyIdempotent

Уведомления ЕЛК (колокольчик в шапке, lk.hse.ru/notification): заголовок, текст, дата, важность, прочитано ли.

NameRequiredDescriptionDefault
limitNoМаксимум уведомлений

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds real value by listing the fields the caller will get back (no output schema exists) and identifying the backing source. It does not disclose ordering, truncation behavior, or whether the 100-item cap silently drops results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with zero filler; the resource identity and its UI location are front-loaded. It is terse to the point of being slightly telegraphic (the field list reads as a fragment), but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with full annotations and no output schema, the description is adequate: it tells the agent what the tool returns and where the data lives. It is incomplete on the operational details an agent would want — result ordering, and whether 'limit' truncates the newest notifications.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one optional parameter and schema coverage is 100%, so the schema already documents 'limit' (max 100, default 20). The description adds nothing about what the limit counts against or what happens when it is exceeded, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific resource (ELK notifications) and pins it to a concrete surface ('колокольчик в шапке, lk.hse.ru/notification'), which unambiguously separates it from LMS-message siblings such as lms_list_messages. It also enumerates the returned content (title, text, date, importance, read status). It stops just short of a 5 because the verb is implicit — the phrasing is a noun list rather than 'retrieves/lists'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this instead of the many sibling listing tools (lms_list_messages, lms_list_assignments, my_today). The UI location helps an agent recognize the concept but gives no exclusion or selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

elk_get_scheduleРасписание через ЕЛКA
Read-onlyIdempotent

Расписание занятий студента через API Единого личного кабинета (lk.hse.ru/api/get-myschedule) — включая ссылки на онлайн-пары. Работает из ЛЮБОЙ сети (в отличие от RUZ, который доступен только из внутренней сети ВШЭ) — основной источник расписания.

NameRequiredDescriptionDefault
daysAheadNoНа сколько дней вперёд от сегодня

Output Schema

NameRequiredDescription
daysYesДни с занятиями по порядку

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world and non-destructive, so the safety profile is covered. The description adds genuine context beyond that: the upstream endpoint, network reachability compared to RUZ, and that returned entries carry online-class links. It stops short of noting caching, rate limits, or freshness of the data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence plus a parenthetical contrast: purpose first, then the network reachability differentiator, then the source-of-truth claim. No filler, nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one optional parameter at full schema coverage, full annotations, and an output schema that explains return values, nothing an agent needs before calling is missing. The network-reachability caveat is the one piece of non-structured knowledge that matters, and it is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single optional daysAhead parameter, including default, min and max, so the schema carries the semantics. The description says nothing about the window parameter or its bounds, which is acceptable at full coverage but adds no value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb+resource (student class schedule) and pins the exact backing API (lk.hse.ru/api/get-myschedule), plus notes it includes online-class links. It explicitly distinguishes itself from RUZ, so an agent can separate it from the sibling read tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Работает из ЛЮБОЙ сети (в отличие от RUZ...)" plus "основной источник расписания" gives a clear selection rule: prefer this for schedule data unless on the HSE internal network. No explicit when-not-to-use is stated, and no sibling tool name in the provided list is called out as an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

elk_get_sectionРаздел ЕЛКA
Read-onlyIdempotent

Один из разделов Единого личного кабинета (lk.hse.ru и его порталы) по имени section. profile — страница профиля /profile текстом и ссылками (ФИО, контакты); для рейтинга, GPA и группы есть elk_get_academic_data. login_history — история входов: дата, действие, IP, местоположение, устройство (проверка безопасности аккаунта; offset — пагинация). tasks — задачи пользователя (/task); поля задачи вживую не подтверждены, ответ как есть (limit — максимум задач). dpo_programs — программы ДПО, на которые подана заявка, со statusLabels; у остальных студентов пусто. antiplagiat — сколько проверок в Антиплагиате обрабатывается, завершено и подано. course_evaluation — периоды СОП («Оцени свои курсы») и заполнена ли анкета. thesis — статус ВКР/КР: тема, заимствования, оценка, рецензия; пусто, если тема не зарегистрирована. portfolio — электронное портфолио (достижения, влияют на повышенную стипендию), текстом. internships — заявки на практику. scholarship_history — история заявок на повышенную стипендию; пусто, если заявок не было. Все разделы только читаются: подача заявок не реализована.

NameRequiredDescriptionDefault
limitNoТолько для tasks: максимум задач (по умолчанию 500)
offsetNoТолько для login_history: смещение для пагинации (по умолчанию 0)
sectionYesКакой раздел прочитать

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive. The description adds genuinely new behavioral detail: write operations (submission of requests) are not implemented, several sections return empty under stated conditions, and task fields are 'не подтверждены' so output is returned as-is. This is useful beyond the annotations, though it doesn't cover rate limits or pagination limits of the response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose followed by a dense but purposeful per-section enumeration; every clause about a section adds meaningful semantics. It is a single long paragraph that would read better as a list, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a polymorphic tool with no output schema, the description carries the burden well by explaining what each section returns, which fields to expect, and empty-result conditions. A few sections ('ответ как есть') remain vague about exact shape, keeping it just under a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents that limit applies only to tasks and offset only to login_history. The description restates these constraints (max tasks, offset pagination) without adding format or syntax detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (read a named section of the Unified Personal Cabinet) and enumerates every section with its concrete contents. It actively distinguishes itself from the sibling elk_get_academic_data for rating/GPA/group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Repeatedly routes the agent: 'для рейтинга, GPA и группы есть elk_get_academic_data', and each section note frames its purpose (login_history for security checking, portfolio for stipend achievements). It lacks an explicit 'when not to use this whole tool' or routing to other siblings like elk_get_user_info, so it stops short of 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

elk_get_user_infoДанные аккаунта ЕЛКA
Read-onlyIdempotent

Базовая структурированная информация об аккаунте в ЕЛК (lk.hse.ru/api/get-user): ФИО, email, роли (студент/ДПО и т.п.). Не содержит академическую карточку (рейтинг, группа, факультет) — за ней используйте elk_get_academic_data.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds value by naming the underlying endpoint and by scoping out academic data, but says nothing about nullability/empty fields or how role values look in practice.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences: capability and returned fields first, scope exclusion and alternative second. Every clause carries information; no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must sketch the return value — it does so by listing the main fields and the endpoint. Slightly incomplete because only example fields are given ('т.п.') and the response envelope structure is unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies no input is needed to identify the account.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: retrieves basic structured account info from the ELK service, and enumerates the returned fields (name, email, roles). It explicitly distinguishes itself from the sibling elk_get_academic_data by naming what it does NOT return.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: for academic card data (rating, group, faculty) use elk_get_academic_data. This gives both the exclusion condition and the named alternative, leaving nothing to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

elk_list_requestsИстория заявок в ЕЛКA
Read-onlyIdempotent

Список всех поданных пользователем заявок в ЕЛК (lk.hse.ru/claim): номер, содержание, сервис, статус (например «Выполнено», «На проверке»), даты создания/обновления, исполнитель и ссылка на форму заявки (если есть). Полезно проверить статус ранее поданных обращений (справки, стипендии, воинский учёт и т.п.) без захода в веб-интерфейс.

NameRequiredDescriptionDefault
limitNoМаксимум заявок

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by stating that the tool returns all user-submitted requests and enumerating the returned fields, including status examples such as 'Выполнено' and 'На проверке'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the tool's purpose, followed by the returned fields and a practical usage note. It is appropriately sized, with every sentence adding useful information about scope, output, or application.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description explains both the scope of the operation and the fields returned. The only parameter is fully covered by the schema, and annotations cover the safety profile, so an agent has enough information to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single parameter `limit` is already documented with a default and maximum. The description does not mention `limit` or add any additional meaning beyond what the schema provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it lists all requests submitted by the user in ELK, with an explicit domain hint (lk.hse.ru/claim). It also names the returned fields (number, content, service, status, dates, assignee, link), making the operation unambiguous compared with sibling tools such as notifications, services, or user info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear use case: checking the status of previously submitted inquiries (certificates, scholarships, military registration) without using the web interface. It does not explicitly name alternatives or when-not-to-use conditions, but the context is sufficiently clear for an agent to select this tool for request history.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

elk_open_pageОткрыть произвольную страницу ЕЛКA
Read-onlyIdempotent

Открыть любую страницу lk.hse.ru по относительному пути под авторизованной SSO-сессией и вернуть видимый текст и список ссылок на странице. Известные разделы (разведаны 2026-09-15): /task (задачи), /claim (заявления/обращения), /service (сервисы), /student-services (Центр сервиса «Студент» — заказ справок, изменение персональных данных, финансовые вопросы; разделы через ?section=documents&subsection=certificates и т.п.), /faq. Хелпдеск-тикеты создаются на отдельном домене pmo.hse.ru/servicedesk/customer/portal/81/create/ (ссылки на конкретные формы есть на странице профиля и student-services).

NameRequiredDescriptionDefault
pathYesОтносительный путь на lk.hse.ru, напр. /claim или /student-services?section=documents

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the bar is lower, yet the description adds real context: requests run under an authorized SSO session and the result is page-visible text plus links. It also discloses an important boundary — ticket creation happens on a different domain — which prevents a futile call. It stops short of describing auth-failure behavior or dynamic-content rendering limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and return values are front-loaded in the first sentence, with the domain caveat placed last. The long parenthetical enumerating student-services subsections is dense but earns its space as routing knowledge; it is the only slightly bloated element.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by stating what comes back (visible text and links). Combined with the route catalog and the cross-domain caveat, an agent has enough to call this correctly; only failure modes and content-size expectations are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is already documented, so baseline would be 3. The description adds value by supplying concrete path examples (/claim, /student-services?section=documents&subsection=certificates) and enumerating valid route families, which makes the relative-path format unambiguous beyond the schema's single example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb+resource ('Открыть любую страницу lk.hse.ru по относительному пути') and even states the return shape (visible text plus a list of links), so an agent knows exactly what the call produces. It does not explicitly contrast itself with the sibling elk_get_section or lms_open_page, so differentiation is only implied by the 'any arbitrary page by path' framing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The catalog of known sections (/task, /claim, /service, /student-services with query examples, /faq) tells the agent concretely when this tool is the right reach, and the note that helpdesk forms live on a separate domain pmo.hse.ru effectively says when NOT to use it. What is missing is an explicit rule such as 'prefer elk_get_section for structured section data'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

elk_search_servicesПоиск сервисов в каталоге ЕЛКA
Read-onlyIdempotent

Полнотекстовый поиск по каталогу сервисов ЕЛК (lk.hse.ru/api/search/search-all, категория services — 254 сервиса на 2026-09-15): справки, заявки на практику/мобильность/стипендии, запись к психологу, антиплагиат и т.п. Возвращает id, название, описание, прямую ссылку на сервис и релевантность (score). Поле categories в ответе — счётчики совпадений по ВСЕМ категориям поиска (сотрудники/студенты/сервисы/подразделения), даже если сами результаты отданы только по сервисам — так можно понять, есть ли смысл поискать ещё и людей/подразделения по этому запросу.

NameRequiredDescriptionDefault
limitNoМаксимум результатов
queryYesПоисковый запрос, напр. 'справка' или 'стипендия'

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world behavior, so the description focuses on what it adds: the exact result fields (id, name, description, direct link, relevance score) and the subtle fact that `categories` counts come from ALL search categories even though results are services-only. That is genuinely non-obvious behavior an agent would otherwise misread.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the verb, resource and endpoint, then the return shape. Slightly dense with parenthetical metadata (catalog size, date) that is helpful but close to excess; still every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so well, naming each field and explaining the categories counter semantics. What is missing is only a note on result ordering/limit behavior and explicit sibling routing, which are secondary for a simple two-parameter search.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with `query` already documented with examples and `limit` bounded 1-50 by the schema. The description adds only topical framing of what queries hit (services catalog), and never mentions the limit parameter, so it does not exceed the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Полнотекстовый поиск по каталогу сервисов ЕЛК'), names the backing endpoint and category, and enumerates what is findable (справки, заявки, психолог, антиплагиат). An agent can tell immediately this is a service-catalog text search, distinct from elk_get_user_info or elk_list_requests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the note that `categories` counters reveal whether it is worth also searching people/departments hints at follow-up routing. There is no explicit statement of when to prefer this over siblings like elk_get_section or elk_list_requests, and no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hse_changesЧто изменилось с прошлого разаA
Read-onlyIdempotent

Снимает текущее состояние дедлайнов, расписания, входящего и заявок (по явной просьбе — оценок) и возвращает ТОЛЬКО изменения с прошлого снимка: новое, изменено, пропало, перенесено, просрочено. Для «что есть сейчас» используйте my_today/my_week/my_deadlines. Первый вызов по источнику создаёт базу без событий (status: baseline). События не теряются, если ответ не дошёл: курсор двигается только явным подтверждением — передайте ackSeq из ответа в параметр ack следующего вызова; без ack те же события вернутся снова. Если persisted: false (запись на диск не удалась), у ответа нет ackSeq (null), у событий нет seq, и события повторятся в следующем вызове — подтверждать нечего. В ответе не более 200 событий: если omitted > 0, ответ усечён — передайте ackSeq ответа в ack и вызовите тул снова, чтобы получить остальное; усечённый ответ не считайте полным. Тул только ЧИТАЕТ системы ВШЭ и пишет лишь локальную базу снимков. «Пропало из календаря» не означает «сдано». Область grades дорогая (страница на курс, десятки секунд) и берёт оценки только из журнала LMS. Возвращает JSON: changes, scopes (статус по областям), sources (статус каждого источника; отказ одного не роняет вызов), ackSeq, omitted, gap, persisted, warnings.

NameRequiredDescriptionDefault
ackNoПередавайте ТОЛЬКО ackSeq из последнего ответа hse_changes (число; null не нужен — просто опустите параметр, если ackSeq был null). seq отдельного события подтверждением НЕ является. События до ackSeq считаются полученными и больше не возвращаются.
freshNotrue — игнорировать кэш (иначе принимаются данные не старше 60 с).
sinceNoЖурнал за период ("7d", "12h" или дата ISO) вместо неподтверждённого; since сам курсор не двигает (ack в том же вызове двигает).
scopesNoОбласти; по умолчанию deadlines, schedule, inbox, claims (без grades).
coursesNoФильтр курсов для grades: число — id курса, строка — часть названия.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it readOnly, openWorld, idempotent and non-destructive, while the description adds substantial context: baseline creation, cursor/ack semantics, persisted:false behavior, 200-event truncation with omitted, source failure isolation, and grades expense. The local snapshot write is disclosed and framed as internal, not as a contradiction of reading external HSE systems.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and alternatives are front-loaded, and every sentence carries operational detail. The dense single paragraph could be more scannable for the ack/truncation rules, so it is strong but not perfect.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description lists the return fields (changes, scopes, sources, ackSeq, omitted, gap, persisted, warnings) and explains baseline, truncation, persistence failure and source-failure cases. An agent has enough information to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is already 100%, the description adds cross-parameter meaning: ack must be ackSeq from the last response, an event seq is not an ack, since does not move the cursor by itself, default scopes exclude grades, and omitted>0 means the response is truncated and must be continued with ack. This goes beyond the schema field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: it snapshots deadlines, schedule, inbox, claims and optionally grades, then returns only changes since the previous snapshot. It explicitly distinguishes itself from my_today/my_week/my_deadlines for current-state queries, so sibling selection is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States when to use it (changes since last snapshot) and when not to use it (use my_today/my_week/my_deadlines for current state). It also explains the first-call baseline behavior and the ack workflow, giving clear operational conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hse_changes_resetСбросить накопленные измененияA
DestructiveIdempotent

Стирает локальные базы снимков и журнал событий области (или всех областей), после чего следующий hse_changes создаёт базу заново. Полный сброс (без scope) удаляет и копии повреждённого файла (state.json.corrupt-*) и оставшиеся временные файлы. Меняет только локальные файлы. Требует confirm: true.

NameRequiredDescriptionDefault
scopeNoОбласть; без неё — все.
confirmYesДолжно быть true: подтверждение стирания.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructive/idempotent annotations by naming exactly what is destroyed (snapshot DBs, event log, corrupt-file copies, temp files), scoping the blast radius to local files only, and stating that recovery happens implicitly via the next hse_changes call. This is precisely the concrete destructive-behavior detail an agent needs before committing an irreversible-looking delete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core destructive action and the recovery path, then escalating detail on the full reset and the local-only scope. Nothing is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive tool with no output schema, the description covers what is deleted, what is preserved (local files only), how state is rebuilt, and the confirmation gate. Nothing an agent needs before invoking is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning about the scope parameter: omitting it means all scopes and additionally triggers deletion of corrupt-file and temp-file remnants. It restates the confirm requirement rather than adding to it, keeping it out of the 5 band.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: wipes local snapshot databases and the scope's event log, and names the follow-on effect on hse_changes. This clearly distinguishes it from the sibling hse_changes (which builds the DB) and hse_clear_cache without needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the operational context (next hse_changes recreates the DB) and distinguishes degraded-state reset from full reset, which effectively tells the agent when each variant applies. It does not explicitly contrast against the sibling hse_clear_cache, so it stops short of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hse_clear_cacheСбросить кэш данных ВШЭA
Idempotent

Результаты тулов lms_*/elk_* и сводок my_today/my_week/my_deadlines (они собираются из тех же ресурсов) кэшируются в памяти на 2–30 минут, чтобы не открывать браузер заново ради неизменившихся данных. Если нужно гарантированно свежее значение — например, сразу после подачи работы или заявки, — вызовите этот тул, затем повторите нужный запрос. scope сужает сброс до одного сервиса.

NameRequiredDescriptionDefault
scopeNoЧто сбросить: all (по умолчанию) или один сервис

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say it is non-read-only but idempotent and non-destructive; the description adds the real behavioral story: what is cached, the 2–30 minute TTL, that the call invalidates rather than mutates data, and that scope can narrow the effect. It does not say what the call returns or confirm there are no other side effects, but the substantive behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, no filler, and the caching rationale sets up why the tool exists before the call instruction. Slightly back-loaded: the actionable 'вызовите этот тул' arrives after a long explanatory clause, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter maintenance tool with no output schema, the description covers what is invalidated, why, when to invoke, and what to do afterward. The only gap is that it doesn't indicate whether a confirmation or status is returned, which an agent may want before re-issuing its query.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the enum (all/elk/lms) is already documented in the schema. The description's 'scope сужает сброс до одного сервиса' restates the enum rather than adding format, precedence, or interaction details beyond it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the operation (cache reset), the resource (HSE tool data), and precisely enumerates the affected tools (lms_*, elk_*, and the my_today/my_week/my_deadlines summaries that share those resources). No sibling tool does this, so an agent can tell it apart from hse_changes_reset or any read tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the trigger condition ('если нужно гарантированно свежее значение — например, сразу после подачи работы или заявки') and gives the follow-up action (repeat the request). It also implicitly discourages routine calls by explaining the TTL exists to avoid unnecessary browser work, but there is no explicit 'do not call when' clause.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lms_get_course_materialsМатериалы курсаA
Read-onlyIdempotent

Список элементов курса SmartLMS (файлы, задания, тесты, форумы и т.п.) по id курса (см. lms_list_courses). Возвращает тип, название и ссылку каждого элемента.

NameRequiredDescriptionDefault
courseIdYesid курса на edu.hse.ru (course/view.php?id=...)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds value beyond that by stating the shape of the response (type, title, URL per element), anticipating what the agent will get back.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences: the resource scope and input source come first, the return contents second. Nothing is padded and nothing needed is missing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, annotated read tool with no output schema, the description covers what is listed, what identifies the course, and what each result contains. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% — the courseId parameter is already documented with its edu.hse.ru URL form. The description only restates that the id refers to a course and points at lms_list_courses, adding minimal semantics beyond the schema; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Список элементов курса SmartLMS') and enumerates what counts as an element (файлы, задания, тесты, форумы), which lets an agent distinguish it from lms_list_assignments and lms_list_courses. It also names the return payload (тип, название, ссылка).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent the input is a course id and points to lms_list_courses as the way to obtain one — a concrete prerequisite chain. It does not, however, say when to prefer this over lms_list_assignments for assignment-only needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lms_get_gradesОценки по курсуA
Read-onlyIdempotent

Оценки студента по курсу SmartLMS (отчёт по пользователю): items — строки журнала по порядку, у каждой name (название элемента или категории), level (уровень вложенности), path (категории-предки), isCategory и grade (текст оценки; null у категории, «-» если оценки ещё нет). Если вёрстка журнала курса не распознана — ошибка.

NameRequiredDescriptionDefault
courseIdYesid курса на edu.hse.ru

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description adds real value beyond them: the shape of the returned items, the meaning of null vs "-" in grade, and an explicit failure mode when the course journal layout is unrecognized. Only pagination/ordering guarantees across calls remain unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then the return contract, then the error case — a logical order with no filler. It is a single dense run-on sentence, and splitting the item-field list would improve scanability, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining returns and does so thoroughly, including field-by-field semantics and the error condition. It stops short of saying how to obtain courseId or whether the report is scoped to the authenticated user, which would complete it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — courseId is already documented as the course id on edu.hse.ru with a positivity constraint — so the baseline is a 3. The description adds no further semantics about the parameter, such as whether it is a course id versus a journal id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: grades of a student for a SmartLMS course, plus explicitly the per-user report scope. It does not contrast itself with siblings such as lms_list_courses or lms_list_assignments, but the purpose itself is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance: no statement that courseId comes from lms_list_courses, no note on when to prefer this versus other LMS tools, and no prerequisites or exclusions. The agent must infer usage purely from the name and the single required parameter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lms_get_messageПисьмо внутренней почты SmartLMSA
Read-onlyIdempotent

Полный текст письма внутренней почты SmartLMS по id (см. lms_list_messages): текст, курс, отправитель, получатели, вложения (имя файла, размер, ссылка на скачивание).

NameRequiredDescriptionDefault
messageIdYesid письма (из lms_list_messages)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds value the annotations do not: it discloses the exact returned fields, including attachment name, size and download link, which matters given there is no output schema. Missing only edge behavior such as what happens for an unknown or inaccessible messageId.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, no filler, front-loaded with the operation and its identifier source, followed by the return-field enumeration. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with no output schema, the enumeration of returned fields compensates well for the absent output contract, and annotations cover safety. Only minor gaps remain: no mention of behavior when the id is invalid or the caller lacks access.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage ('id письма (из lms_list_messages)'), so the description merely repeats the schema wording verbatim. Baseline 3 is correct when the schema already carries the semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Полный текст письма ... по id') and immediately enumerates the payload (text, course, sender, recipients, attachments). It names the sibling lms_list_messages as the source of the id, so an agent can distinguish fetching one message from listing many without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(см. lms_list_messages)' establishes the workflow: list first, then fetch by id, which implicitly rules out using this tool for discovery. It gives clear context but no explicit when-not-to-use or error/precondition guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lms_list_assignmentsЗадания курсаB
Read-onlyIdempotent

Список заданий (mod/assign) курса SmartLMS со сроками сдачи и статусами.

NameRequiredDescriptionDefault
courseIdYesid курса на edu.hse.ru

Output Schema

NameRequiredDescription
assignmentsYesСтроки таблицы заданий курса: заголовок колонки → текст ячейки

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds that each item carries сроки сдачи and статусы, which tells the agent what fields come back, but nothing about permissions, enrollment scoping, or pagination. Adequate but thin for a tool with annotations doing most of the disclosure work.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no filler, and the resource scope is front-loaded. It is terse to the point of omitting usage framing, but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and a fully documented single parameter, the definition covers enough to invoke the tool correctly. It is incomplete on the selection side: an agent choosing among my_deadlines, lms_get_grades, and lms_list_courses gets no basis for picking this one.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage ('id курса на edu.hse.ru'), so the schema already carries the meaning. The description only implies that results are scoped to that course and adds no format or constraint detail beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Список') and resource ('заданий курса'), names the Moodle module type (mod/assign), and says the payload includes deadlines and statuses. It is not differentiated from overlapping siblings such as my_deadlines or lms_get_grades, which also surface assignment/grade data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only inferable from the required courseId: list assignments for one course. There is no statement of when to prefer this over my_deadlines (deadline aggregation) or lms_get_course_materials, and no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lms_list_coursesСписок курсов SmartLMSA
Read-onlyIdempotent

Список курсов текущего студента на SmartLMS (edu.hse.ru, Moodle): id, название, категория, даты начала/окончания, процент прохождения, избранное/скрытое. Требует входа через единый SSO ВШЭ (выполняется автоматически, credentials из .env).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
coursesYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered; the description adds genuinely new context that SSO auth is required and happens automatically with credentials from .env, which matters for an open-world scraper tool. It stops short of mentioning latency, rate limits, or failure modes on auth expiry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the resource and returned fields come first, followed by the operational prerequisite. Every clause carries information an agent would otherwise have to guess.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be spelled out, and the auth prerequisite is disclosed. The one gap is the absence of any routing hint among the many sibling lms_* tools for agents unsure whether courses or assignments/grades are wanted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The enumerated return fields are informative but relate to output, not parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list of the current student's courses on SmartLMS/edu.hse.ru Moodle) and enumerates the returned fields, so the purpose is unambiguous. It does not explicitly distinguish itself from siblings such as lms_get_course_materials or lms_list_assignments, which keeps it short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Scope is implied by 'текущего студента' (current student only), which tells the agent whose courses are returned, but there is no explicit when-to-use, when-not-to-use, or pointer to an alternative sibling tool. Usage must be inferred from the name and resource.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lms_list_messagesВходящие внутренней почты SmartLMSA
Read-onlyIdempotent

Список входящих писем внутренней почты SmartLMS (плагин local_mail, edu.hse.ru/local/mail) — переписка с преподавателями внутри курсов. Важные объявления и материалы от преподавателей часто приходят именно сюда. Возвращает тему, курс, отправителя, дату, статус прочтения, число вложений.

NameRequiredDescriptionDefault
limitNoМаксимум писем

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the bar is lower. The description still adds value by enumerating the returned fields (subject, course, sender, date, read status, attachment count), which no output schema provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with what the tool lists, then the source system, then the return fields. The 'important announcements often arrive here' line is mildly promotional but does double duty as usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-shape burden and does so adequately for a read-only list tool. Pagination/limit behavior and how to fetch a single message are the only material gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (limit) exists and schema coverage is 100%, so the schema fully documents it. The description never mentions the limit or default paging behavior, so it adds nothing beyond the structured field — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list incoming internal-mail messages), plus the underlying plugin (local_mail) and scope (correspondence with teachers within courses). It implicitly distinguishes itself from the singular sibling lms_get_message, but never names it explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The sentence about important announcements and materials from teachers arriving here hints at when to check this inbox, but usage is only implied — there is no explicit 'use lms_get_message to read one message' routing or any exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lms_open_pageОткрыть произвольную страницу SmartLMSA
Read-onlyIdempotent

Открыть любую страницу edu.hse.ru по относительному пути (например /calendar/view.php) под авторизованной сессией и вернуть видимый текст и ссылки. Полезно для сценариев, не покрытых готовыми тулами.

NameRequiredDescriptionDefault
pathYesОтносительный путь на edu.hse.ru, напр. /calendar/view.php?view=month

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds value annotations cannot: the request runs under an authenticated session and returns visible page text plus links. It omits failure behavior (redirects to login page, invalid path), which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler: the action and scope come first, the return value second, and the positioning clause last. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one required parameter, full schema coverage, no output schema, and safety covered by annotations, the description supplies the missing return-value context. Only edge-case behavior (unauthenticated redirects, non-200 paths) is left implicit, a minor gap for a generic page-fetch tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter is already documented with an example in the schema itself. The description repeats 'относительный путь' and an example path, adding no syntax or format detail beyond structured data; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (открыть), resource (любая страница edu.hse.ru), access context (под авторизованной сессией) and output (видимый текст и ссылки). The final clause carves out its niche versus the specialized siblings, so an agent can tell it is the generic escape hatch rather than a substitute for lms_get_grades or lms_get_course_materials.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Полезно для сценариев, не покрытых готовыми тулами" gives explicit fallback guidance: use this when no purpose-built tool exists. It stops short of naming a concrete alternative or warning about when not to use it (e.g. don't scrape grades this way), so it is clear context rather than full routing logic.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_deadlinesДедлайныA
Read-onlyIdempotent

Что горит: несданные задания и тесты SmartLMS (в том числе просроченные, у которых приём уже закрыт), окна ЕЛК (например, оценка курсов), активные задачи и заявки ЕЛК, ближайшие экзамены/зачёты за days дней вперёд. Элементы без распознанной даты идут в конце с when: null. Возвращает JSON: items — единый список элементов (kind, when, title, course, place, overdue, unread, source, ...), отсортированный: просроченные несданные первыми, затем по времени, затем без даты; sources — статус каждого источника (ok/error/skipped, текст ошибки, warnings). Если источник недоступен (например, ЕЛК не ответил), сводка всё равно возвращается — смотрите sources.

NameRequiredDescriptionDefault
daysNoГоризонт в днях вперёд
coursesNoСузить курсы SmartLMS: число — id курса, строка — часть названия. По умолчанию — все видимые курсы: будущие дедлайны берутся у актуальных (не завершённых), просроченные несданные — у любых видимых. Расписание, окна ЕЛК и остальные источники фильтром не ограничиваются.

Output Schema

NameRequiredDescription
itemsYes
windowYes
sourcesYes
generatedAtYes

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, open-world behavior, and the description adds real substance on top: partial-failure semantics (the summary is still returned when a source errors, check `sources`), deterministic sort order (overdue unsubmitted first, then by time, then undated), and null-date placement. That is exactly the kind of beyond-annotation context an agent needs for a multi-source aggregator.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with what is included before moving to the return shape and the degraded-source caveat. No filler; the ordering of information matches how an agent needs to read it. Output-field naming overlaps slightly with the output schema but the sort rationale is not derivable from it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the areas that matter for a fan-in aggregator: source coverage, sort semantics, null dates, and graceful degradation with per-source status. Since an output schema exists, restating `items`/`sources` field lists is somewhat redundant, but the explanation of degraded-mode behavior is the piece the schema could not carry.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are thoroughly documented in the schema, including the courses id-vs-name matching rule and the note that the filter does not apply to schedule/ELK sources. The description only echoes the `days` horizon ('за days дней вперёд') and adds nothing new about parameters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely enumerates the aggregated resource: unsubmitted SmartLMS assignments/tests (including overdue with closed submission), ELK windows, active ELK tasks/requests, and upcoming exams within a day horizon. This is far more than a restatement of the title 'Дедлайны'. It does not explicitly name the close siblings (my_today, my_week, lms_list_assignments), so differentiation is inferable from scope rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage is implied by the enumerated scope and the `days` horizon, which distinguishes it from single-source tools, but the description never says when to prefer this over my_today, my_week, or lms_list_assignments. The only explicit guidance is about handling a failed source ('смотрите sources'), which is about reading output, not about tool choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_todayСводка на сегодняA
Read-onlyIdempotent

Что у студента сегодня: занятия на сегодня, дедлайны (все просроченные несданные и до конца завтрашнего дня) из SmartLMS и ЕЛК, экзамены/зачёты, непрочитанная внутренняя почта SmartLMS, непрочитанные уведомления ЕЛК, активные заявки и задачи ЕЛК. Возвращает JSON: items — единый список элементов (kind, when, title, course, place, overdue, unread, source, ...), отсортированный: просроченные несданные первыми, затем по времени, затем без даты; sources — статус каждого источника (ok/error/skipped, текст ошибки, warnings). Если источник недоступен (например, ЕЛК не ответил), сводка всё равно возвращается — смотрите sources.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
itemsYes
windowYes
sourcesYes
generatedAtYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, open-world, non-destructive, so the description's added value is the graceful-degradation contract: if a source is unreachable the summary is still returned and per-source status lives in `sources` (ok/error/skipped, error text, warnings). That is a real behavioral trait beyond the annotations; it stops short of stating cost, rate limits, or freshness/caching of the aggregated data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the 'today' scope, then contents, then return shape and the failure caveat. The item field list (kind, when, title, course, place, overdue, unread, source, ...) and the sources description partly duplicate the output schema, which is the only slack in an otherwise dense paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument aggregator spanning two external systems, the description covers contents, ordering guarantees, return envelope, and partial-failure handling. With an output schema present, no further return-value detail is required; nothing an agent needs to invoke it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4; no parameter semantics are needed or missing. The description correctly spends no space on inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Enumerates exactly what the tool aggregates for 'today': classes, deadlines (with a precise window — all overdue unsubmitted plus through end of tomorrow) from SmartLMS and ЕЛК, exams, unread mail/notifications, active requests and tasks. Scope is unambiguous and separable from my_week / my_deadlines by its 'today' window, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The framing 'Что у студента сегодня' plus the exact deadline window gives clear context for when this tool applies (daily briefing requests) rather than alternatives like my_week. It never states exclusions or explicitly routes to the sibling tools, so guidance remains inferential rather than directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_weekСводка на неделюA
Read-onlyIdempotent

План на ближайшие 7 дней (сегодня + 6): расписание занятий, дедлайны SmartLMS и ЕЛК, экзамены/зачёты, просроченные несданные работы. Без почты и уведомлений — для них my_today. Возвращает JSON: items — единый список элементов (kind, when, title, course, place, overdue, unread, source, ...), отсортированный: просроченные несданные первыми, затем по времени, затем без даты; sources — статус каждого источника (ok/error/skipped, текст ошибки, warnings). Если источник недоступен (например, ЕЛК не ответил), сводка всё равно возвращается — смотрите sources.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
itemsYes
windowYes
sourcesYes
generatedAtYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing partial-failure semantics: if a source like ЕЛК fails, the summary is still returned and callers must inspect sources (ok/error/skipped, error text, warnings). Annotations already cover safety (readOnly, idempotent, non-destructive) and openWorldHint fits an aggregator hitting external systems, so this added degradation contract is the high-value content.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads scope and horizon, then exclusion, then return shape — a sensible order with no filler sentences. It is somewhat dense, and enumerating item fields (kind, when, title, course, ...) duplicates the existing output schema, which is the only real redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter aggregator, the definition covers scope, exclusions, error tolerance, and result ordering. An output schema exists, so the description need not detail return values further, yet it still flags the degraded-mode behavior that no schema field alone would convey.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so there is nothing parameter-wise to disambiguate; baseline 4 applies. The description instead spends its space on the output contract, which is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the concrete resource and horizon ("План на ближайшие 7 дней (сегодня + 6)") and enumerates the exact content classes it aggregates: расписание, дедлайны SmartLMS и ЕЛК, экзамены/зачёты, просроченные работы. It also explicitly excludes mail/notifications and points at the sibling my_today, so it is distinguishable without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit exclusion with a named alternative: "Без почты и уведомлений — для них my_today", which is a clear routing rule. It does not address overlap with the other close sibling, my_deadlines, which also appears to surface deadline data, so the when-to-use picture is clear but not fully complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 18 tool updatesv0.1.2
    • Changedelk_get_notifications1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedelk_get_schedule24 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / days / items / properties / lessons / items / additionalProperties
        Previous value: -trueNew value: +{}
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / auditorium / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / auditorium / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / begin_time / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / begin_time / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / building / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / building / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / end_time / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / end_time / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / lecturer / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / lecturer / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / lesson_type / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / lesson_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / parent_schedule / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / parent_schedule / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / url1 / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / url1 / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / url1_description / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / url1_description / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / url2 / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / url2 / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / days / items / properties / lessons / items / properties / url2_description / $ref
        Removed value: -"#/properties/days/items/properties/lessons/items/properties/name"
      • addedOutput schema / properties / days / items / properties / lessons / items / properties / url2_description / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedelk_get_section2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedelk_list_requests1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedelk_open_page1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedelk_search_services1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedhse_changes1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedhse_changes_reset1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedhse_clear_cache1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlms_get_course_materials2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / courseId / maximum
        Added value: +9007199254740991
    • Changedlms_get_grades2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / courseId / maximum
        Added value: +9007199254740991
    • Changedlms_get_message2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / messageId / maximum
        Added value: +9007199254740991
    • Changedlms_list_assignments3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / courseId / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / assignments / items / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedlms_list_messages1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlms_open_page1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedmy_deadlines4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / courses / items / anyOf
        Previous value: -[
        -  {
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  },
        -  {
        -    "minLength": 1,
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedOutput schema / properties / items / items / properties / raw / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / sources / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedmy_today2 fields changed
      • addedOutput schema / properties / items / items / properties / raw / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / sources / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedmy_week2 fields changed
      • addedOutput schema / properties / items / items / properties / raw / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / sources / propertyNames
        Added value: +{
        +  "type": "string"
        +}
  2. 21 tool updatesv0.1.1
    • First observedelk_get_academic_data
    • First observedelk_get_notifications
    • First observedelk_get_schedule
    • First observedelk_get_section
    • First observedelk_get_user_info
    • First observedelk_list_requests
    • First observedelk_open_page
    • First observedelk_search_services
    • First observedhse_changes
    • First observedhse_changes_reset
    • First observedhse_clear_cache
    • First observedlms_get_course_materials
    • First observedlms_get_grades
    • First observedlms_get_message
    • First observedlms_list_assignments
    • First observedlms_list_courses
    • First observedlms_list_messages
    • First observedlms_open_page
    • First observedmy_deadlines
    • First observedmy_today
    • First observedmy_week

TDQS

A3.6/5.0

Scored across 21 tools

Disambiguation4/5

Most tools target a clearly distinct resource (messages, courses, materials, assignments, grades, schedule, requests, notifications), and the descriptions explicitly steer between near-neighbors (elk_get_user_info vs elk_get_academic_data vs elk_get_section/profile). The fuzzy spots are the three summary tools (my_today / my_week / my_deadlines), which share item schema and overlap on deadlines, plus the catch-all elk_get_section that overlaps its sibling readers. Descriptions resolve these well, so an agent can still choose correctly.

Naming Consistency4/5

Strong snake_case with source prefixes (lms_*, elk_*, hse_*, my_*) and predictable verbs (list/get/search/open/clear/reset). Minor deviations: the aggregators use a my_* prefix with no verb-noun shape, and hse_changes / hse_changes_reset are noun-style rather than verb-first. Still highly readable and predictable overall.

Tool Count3/5

At 21 tools this sits at the heavy end for what is essentially a read-only student dashboard. Several tools earn their place, but the my_today / my_week / my_deadlines trio plus hse_changes / hse_changes_reset / hse_clear_cache add substantial surface area for what could be fewer, parameterized tools.

Completeness3/5

Read coverage is broad and thoughtful (courses, materials, assignments, grades, mail, schedule, requests, notifications, academic card, portfolio, thesis), with an open_page fallback for unknown pages. However the surface is strictly read-only: no submitting assignments, no sending or replying to mail, and request submission is explicitly unimplemented, so common student workflows dead-end. open_page cannot substitute for form submission.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    B
    maintenance
    MCP server for the Moodle-based Campus Virtual FCEIA UNR, providing tools to read courses, assignments, forums, and grades, plus write operations (posting, grading, messaging, events) with dry-run safety.
    20
    1
    -
  • A
    license
    A
    quality
    B
    maintenance
    A read-only MCP server that lets students query Union College's Nexus (Moodle) account through natural language, covering courses, assignments, due and overdue work, grades, course materials, announcements, and calendar events, plus daily/weekly briefings and workload analysis. It uses Moodle's official web-service API with a personal student token, so it only reads the user's own data and never writes or scrapes.
    19
    1
    MIT