hse-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hse-mcpwhat assignments are due this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 — без терминала
Скачайте
hse-mcp-<версия>.mcpbиз последнего релиза.Откройте файл двойным щелчком (или перетащите в окно Claude Desktop, или Настройки → Расширения → Дополнительно → Установить расширение…).
Введите email и пароль ВШЭ и нажмите «Установить». Пароль Claude Desktop хранит в системной связке ключей и передаёт серверу при запуске.
Node.js ставить не нужно: он входит в Claude Desktop для Windows и macOS. Для входа нужен браузер:
сервер берёт Microsoft Edge (есть на любой Windows) или Google Chrome, а если их нет, при первом запросе
сам скачивает Chromium (около 100 МБ, один раз) — тогда первый запрос попросит повторить его через
пару минут. Галочка «Разрешить отправку данных» включает тулы записи (см. «Тулы записи»); по
умолчанию она выключена. Файлы для сдачи заданий кладутся в папку из настроек расширения (по умолчанию
Документы/hse-mcp-outbox, создаётся сама).
Через npx (нужен Node.js 22+)
npx -y hse-mcp credentials set # email и пароль ВШЭ → системное хранилище
claude mcp add hse-mcp -e HSE_EMAIL=login@edu.hse.ru -- npx -y hse-mcpДля Claude Desktop, Cursor и других клиентов — в их конфигурацию MCP:
{
"mcpServers": {
"hse-mcp": {
"command": "npx",
"args": ["-y", "hse-mcp"],
"env": { "HSE_EMAIL": "login@edu.hse.ru" }
}
}
}Пароль в этот файл не пишите: он хранится открытым текстом. npx -y hse-mcp install-browser скачивает
Chromium заранее (иначе — как выше: Edge, Chrome или скачивание при первом запросе).
Из исходников (для разработки)
Нужен Node.js 22 или новее.
npm ci
npx playwright install chromium
cp .env.example .env # заполнить HSE_EMAIL
npm run credentials:set # пароль в системное хранилище (рекомендуется)
npm run build
claude mcp add hse-mcp -- node <путь-к-проекту>/dist/index.jsHSE_PASSWORD в .env необязателен: это запасной путь, если системное хранилище недоступно (см.
«Учётные данные»). .env и storage/ в .gitignore — не коммитятся, локальны для установки и никуда
не отправляются, кроме как в сами сервисы ВШЭ при логине.
Каталог данных
Сессия браузера, ключ и журнал записей, снимки hse_changes и папка «исходящих» по умолчанию лежат в
каталоге данных:
в клоне репозитория (есть
.git) или еслиstorage/уже есть —storage/в корне проекта;иначе (
.mcpb, npx) —%LOCALAPPDATA%\hse-mcpна Windows,~/Library/Application Support/hse-mcpна macOS,~/.local/share/hse-mcpна Linux: папку установки хост может пересоздать при обновлении;HSE_DATA_DIRзадаёт каталог явно (абсолютный путь или относительно корня проекта).
Необязательные переменные (.env или окружение): HSE_ENABLE_WRITES=true включает тулы записи (по
умолчанию выключены; см. «Тулы записи»), HSE_OUTBOX_DIR задаёт папку «исходящих»,
HSE_BROWSER_CHANNEL — браузер: auto (по умолчанию: скачанный Chromium, затем Edge и Chrome, затем
скачивание), chromium, chrome или msedge. Проверка, что защита записи цела: npm test (ожидается
fail 0; тесты не ходят в сеть и не читают учётные данные).
Учётные данные
Пароль ищется по порядку, берётся первый найденный:
переменная окружения процесса
HSE_PASSWORD(в том числе заданная клиентом MCP);системное хранилище: Windows Credential Manager, macOS Keychain, Linux Secret Service (служба
hse-mcp, учётная запись — значениеHSE_EMAIL), через необязательную зависимость@napi-rs/keyring;HSE_PASSWORDв.env— запасной путь.
HSE_EMAIL не секрет и берётся из окружения или .env.
Команды:
npm run credentials:set(илиnpx hse-mcp credentials set) — спрашивает пароль без вывода на экран и пишет в системное хранилище;npm run credentials:status(npx hse-mcp credentials status) — печатает только источник пароля (env,keychain,dotenv,none), без значений и без email;npm run credentials:clear(npx hse-mcp credentials clear) — удаляет запись из хранилища.
В пакете .mcpb пароль приходит из настроек расширения через окружение (HSE_PASSWORD), системное
хранилище hse-mcp там не используется.
Если пароль взят из .env, сервер один раз пишет в stderr предупреждение (без значения); на Linux и macOS
он же предупреждает, если права .env допускают чтение группой или другими (исправление: chmod 600 .env).
На Windows права .env сервер не проверяет; ограничьте их вручную, подставив своё имя пользователя:
icacls .env /inheritance:r /grant:r "$($env:USERNAME):(F)"Каталог данных (storage/ в клоне) и его writes/ сервер ограничивает владельцем (0o700 на POSIX, icacls с
наследованием на Windows, чтобы новые файлы сразу создавались с ограниченными правами), а файлы
hse-session.json и writes/key — 0o600 / icacls (ошибки при этом не выводятся).
Системное хранилище можно отключить целиком: HSE_DISABLE_KEYCHAIN=true (в окружении или .env) — для CI,
серверов без графической сессии и Linux без Secret Service. npm test задаёт её сам, поэтому тесты не
трогают настоящее хранилище.
Оговорки:
Если
@napi-rs/keyringне установился (npm ci --omit=optional, нет бинарника под платформу) или хранилище недоступно, проект молча работает дальше с.env, установка не падает.На Linux нужен запущенный Secret Service (GNOME Keyring, KWallet и т.п.; в сессии без графики часто его нет). Без него пакет ушёл бы в хранилище ядра
keyutils, которое не переживает перезагрузку, поэтому в таком случае хранилище считается недоступным и остаётся.env. Эта проверка — синхронный вызов при старте; при заблокированной связке ключей или без D-Bus он может надолго задержать запуск, тогда задайтеHSE_DISABLE_KEYCHAIN=true. Таймаута у вызова нет. Работа на Linux не проверялась.Защита рассчитана на случайную утечку и на чтение файлов другим пользователем системы, но не на вредоносную программу под вашим пользователем.
Если пароль или файлы каталога данных могли утечь: смените пароль ВШЭ (в .mcpb — и в настройках
расширения), удалите hse-session.json и writes/key в каталоге данных (папка outbox/ и журнал
записей — ваши данные), выполните npm run credentials:clear. Подробности и контакт для сообщений об уязвимостях — в SECURITY.md.
Для публичного репозитория включите на GitHub secret scanning и push protection (по желанию — gitleaks
в pre-commit; в зависимости проекта он не входит).
Тулы
21 тул чтения и 3 тула записи (только при HSE_ENABLE_WRITES=true). Что из этого покрыто тестами и
проверено вживую — в docs/status.md.
Модуль | Тул | Описание |
SmartLMS |
| Список курсов |
SmartLMS |
| Элементы курса (файлы, задания, тесты и т.п.) |
SmartLMS |
| Задания курса со сроками |
SmartLMS |
| Оценки по курсу: строки журнала с названием, путём категорий и оценкой; ошибка, если вёрстка журнала курса не распознана |
SmartLMS |
| Входящие внутренней почты SmartLMS (переписка с преподавателями в курсах) |
SmartLMS |
| Полный текст письма внутренней почты SmartLMS с вложениями |
SmartLMS |
| Открыть произвольную страницу edu.hse.ru |
ЕЛК |
| Расписание через API ЕЛК — работает из любой сети |
ЕЛК |
| Данные аккаунта: ФИО, email, роли |
ЕЛК |
| Академическая карточка: рейтинг, GPA, кредиты, программа, группа |
ЕЛК |
| Поиск по каталогу из 254+ сервисов ЕЛК (справки, заявки и т.п.) |
ЕЛК |
| История поданных заявок ( |
ЕЛК |
| Уведомления (колокольчик в шапке) |
ЕЛК |
| Раздел ЕЛК по имени: |
ЕЛК |
| Открыть произвольную страницу lk.hse.ru |
Сводки |
| Что сегодня: занятия, дедлайны, непрочитанные письма LMS и уведомления ЕЛК, активные заявки |
Сводки |
| План на 7 дней: расписание, дедлайны, экзамены, просроченные несданные работы |
Сводки |
| Что горит: несданные задания и тесты (в т.ч. просроченные), окна ЕЛК, экзамены за |
Изменения |
| Что изменилось с прошлого раза: дедлайны, расписание, входящее, заявки (и оценки LMS по явной просьбе); |
Изменения |
| Стереть локальные базы и журнал событий ( |
Служебное |
| Сбросить кэш в памяти, чтобы следующий вызов взял свежие данные |
SmartLMS (запись) |
| Сдать или поправить ответ на задание файлами из папки «исходящих». Только при |
SmartLMS (запись) |
| Удалить представленный ответ на задание. Только при |
ЕЛК (запись) |
| Заказать справку через форму сервиса ЕЛК (необратимо). Только при |
Тулы записи — что нужно знать
Три тула записи (lms_submit_assignment, lms_delete_submission, elk_order_certificate) отправляют
данные в SmartLMS и ЕЛК, заказ справки в ЕЛК необратим, поэтому по умолчанию тулов записи у сервера нет вообще. Чтобы
включить, добавьте в .env строку HSE_ENABLE_WRITES=true (в Claude Desktop — галочка «Разрешить
отправку данных» в настройках расширения; значение читается при старте процесса, после правки
перезапустите сервер). Остальные тулы только читают.
lms_submit_assignment—cmid(id модуля задания изlms_get_course_materials),files(имена файлов, не пути),mode:draft(по умолчанию) илиsubmit. Файлы берутся только из папки «исходящих»:outbox/в каталоге данных или папка изHSE_OUTBOX_DIR(абсолютный путь или относительно корня проекта); если папки нет, а её родитель есть, она создаётся. Не больше 10 файлов, только обычные непустые файлы; папка не может быть корнем проекта или каталогом данных (кроме егоoutbox/). Файлы не удаляются и не перемещаются. Одноимённый файл ответа перезаписывается, остальные файлы ответа остаются. Онлайн-текст не поддерживается: параметрtextотклоняется.lms_delete_submission—cmid. Удаляет ответ из системы; файлы в папке «исходящих» остаются.elk_order_certificate—serviceId(числоcomponentsизurlрезультатаelk_search_services, не полеid) иfields(подпись поля формы → точный текст варианта выпадающего списка). Сухой прогон с пустымfieldsоткроет форму и вернёт отказ со списком обязательных полей и вариантов (неподдерживаемые варианты помечены) — так узнают, что выбирать; превью иpreviewTokenвыдаются, когда все обязательные поля заданы. Значения, которые форма подставила сама из личных данных ЕЛК, показываются только в ответе сухого прогона и уйдут в заявку как есть. Заказ необратим: отмены заявки в ЕЛК нет. Заполняются только выпадающие списки; обязательное поле другого типа, которое форма не заполнила сама, и варианты вида «…в дополнительном поле» отклоняются. За раз выполняется один заказ. Исход проверяется по заявкам «Сервиса Студент» со страницы «Заявки» (вelk_list_requestsих нет):confirmed— после заказа появилась ровно одна новая заявка, её номер в ответе; иначеunknown, иnewClaims: 0не означает, что заказ не прошёл. Приunknownсверяйте вручную на странице «Заявки» в lk.hse.ru и не повторяйте заказ без этой проверки. Новый источник проверки вживую с заказом ещё не проверялся.
Как пользоваться:
Сначала сухой прогон. Вызов без
confirmничего не отправляет: он читает страницу задания (для справки — форму) и показывает, что будет добавлено и заменено, предупреждения иpreviewToken.Запись — тот же вызов с
confirm: trueиpreviewTokenиз сухого прогона. Токен действует 15 минут, одноразовый и привязан к заданию, режиму, файлам (по содержимому) и состоянию ответа: если что-то изменилось, нужен новый сухой прогон.Не добавляйте тулы записи в автоматические разрешения клиента (в Claude Desktop — не выбирайте для них «Разрешать всегда»). Защита от случайной отправки держится на запросе разрешения клиента MCP перед каждым вызовом: сервер не может проверить, что человек на месте.
Исход проверяется чтением и бывает трёх видов:
confirmed(подтверждено),rejected(система отказала, состояние не изменилось),unknown(проверить не удалось). Послеunknownне повторяйте отправку: откройте задание на сайте (для справки — страницу «Заявки» в lk.hse.ru) и посмотрите, что там на самом деле. Повторный вызов с тем жеpreviewTokenничего не отправляет: для заданий он перепроверит результат чтением, а для справки не перепроверяет, а возвращаетunknownс подсказкой сверить вручную. Новая запись по этой цели потребуетacknowledgeUnknown: true. Для заказа справкиrejectedне выносится никогда.Сохранение может сразу отправить работу на оценку: у заданий без отдельного шага «Отправить на оценку»
draftэтого не исключает. Шаг «Отправить на оценку» тул сам не выполняет. Просроченные и закрытые задания тул отклоняет.
Журнал записей лежит в writes/journal.json каталога данных (90 дней, не более 200 записей) и содержит только
технические поля: без содержимого, имён файлов, названий и id курсов и заданий.
Как это устроено
SmartLMS и ЕЛК — общий Playwright-браузер (
src/auth/browser-session.ts), который проходит единый SSO ВШЭ (Keycloak,saml.hse.ru, realmhse) и переиспользует сессию между вызовами (сохраняется вhse-session.jsonкаталога данных). Браузер — скачанный Playwright Chromium, системный Edge или Chrome (src/auth/browser-launch.ts). ЕЛК даёт и JSON API сAuthorization: Bearer <access_token>из localStorage (elk_get_schedule,elk_get_user_info,elk_search_services,elk_list_requests).istudy.hse.ru (зачётка) не поддерживается: тулы
istudy_*удалены 2026-10-23. Вход проходит без MAX, но данные закрыты двухфакторным подтверждением через MAX (HTTP 412 наGET /api/auth/two-factor/requiredпосле клика по «Зачетная книжка»), а эндпоинты после 2FA неизвестны; обход 2FA не предусмотрен. Оценки по курсам —lms_get_grades.Сводки (
my_today/my_week/my_deadlines) — агрегируют расписание ЕЛК, календарь Moodle, окна и уведомления ЕЛК в один JSON; статус каждого источника — вsources, отказ одного не роняет сводку. Холодный вызов после запуска сервера занимает ≈ 17 с (логин и открытие страниц), затем 3–4 с, повтор из кэша — мгновенно (замеры на одном аккаунте, 2026-10-14).Изменения (
hse_changes) — «что изменилось», а не «что есть»: тул снимает дедлайны, расписание на 14 дней, входящее (письма LMS, уведомления ЕЛК) и заявки ЕЛК, сравнивает с прошлым снимком и возвращает только события (новое, изменено, пропало, перенесено, просрочено). Базы по источникам и журнал событий лежат в локальномchanges/state.jsonкаталога данных; сброс —hse_changes_reset(полный сброс удаляет и копииstate.json.corrupt-*). Первый вызов по источнику только создаёт базу, без событий. Курсор двигается не сам, а параметромack: передайтеackSeqиз ответа в следующий вызов, иначе те же события вернутся снова (событие не теряется, даже если ответ не дошёл). Параметры:scopes(по умолчанию без оценок),courses(фильтр курсов для оценок: id или часть названия),fresh(перечитать источники, иначе принимаются данные не старше 60 с),since(журнал за период, например"7d", вместо неподтверждённого;sinceсам курсор не двигает,ackв том же вызове двигает). Оценки (scopes: ["grades"]) берутся только из журнала LMS и дорогие: страница на курс, десятки секунд. Тул только читает системы ВШЭ. Проверено вживую на одном аккаунте (спека §18); событияadded/changed/moved— только имитацией правки базы.
Границы применимости
Селекторы и тексты Moodle (SmartLMS) и ЕЛК проверены на одном аккаунте и одном семестре; у других факультетов и курсов разметка может отличаться.
Онлайн-текст в ответе на задание не поддерживается.
Заданий с отдельным шагом «Отправить на оценку» и с классом статуса
submissiondraftне наблюдалось: в таких случаях тулы записи отказывают, а не угадывают.Заказ справки проверен на форме одной справки.
Правила ВШЭ об автоматизированном доступе к SmartLMS и ЕЛК не проверялись, пользователь отвечает за их соблюдение сам.
Известные ограничения
Расписание в сводках — только из ЕЛК: если ЕЛК не ответил, в
my_*будет ошибка источникаelk_scheduleбез занятий (запасного пути через RUZ больше нет, RUZ — в hse-ruz-mcp и только из сети ВШЭ).ЕЛК частично разведан вживую (2026-09-15): известны разделы
/task,/claim(теперь структурированно доступен черезelk_list_requests),/service(поиск —elk_search_services),/schedule,/student-services,/faq./student-services?section=documentsсодержит каталог заказа справок (зачётка, подтверждение обучения и т.п.) — форма разведана (Formily-конструктор поверх Element Plus); заказ идёт туломelk_order_certificate(приHSE_ENABLE_WRITES=true).elk_open_pageвозвращает сырой текст + ссылки для остальных случаев. Подробные заметки разведки хранятся у автора локально и в репозиторий не входят.hse_changes: в ответе не более 200 событий (остаток —omitted: подтвердитеackSeqи вызовите снова); журнал хранит не более 500 событий, при переполнении невыданные теряются — счётчикgap.lostEvents. События считаются только в пересечении старого и нового окон (календарь −180…+60 дней, расписание 14 дней); при усечении календаря «пропало» не вычисляется. Виды событий по областям: дедлайны — новое, изменено, пропало, просрочено; расписание — новое, изменено, пропало, перенесено; входящее — только новое; заявки и оценки — новое и изменено (без «пропало»). «Пропало из календаря» не значит «сдано». «Итого за курс» — обычный элемент оценок: смена итога видна рядом с событием самого элемента.ЕЛК: запись только заказом справки (
elk_order_certificate,HSE_ENABLE_WRITES=true); подача заявок (практика, стипендия, мобильность и т.п.) не реализована, остальные тулы ЕЛК только читают. Заказ справки выполнен вживую один раз на одном аккаунте: заказ дошёл, но исход тула —unknown(newClaims: 0), история заявок этих справок не видит; ручная проверка на странице «Заявки» подтвердила ровно одну новую заявку. Заказ необратим; свободный текст, даты, файлы и варианты «…в дополнительном поле» не поддерживаются (тул отказывает). Поля, которые форма дорисовывает после выбора варианта, сухой прогон не видит.Запись в SmartLMS (
HSE_ENABLE_WRITES=true): только файлами, онлайн-текст не поддерживается. У заданий без отдельного шага «Отправить на оценку» сохранение сразу отправляет работу на оценку; сам шаг «Отправить на оценку» тул не выполняет. Просроченные и закрытые задания отклоняются, даже если поздняя сдача, возможно, ещё открыта. Задания с нераспознанным классом статуса сдачи отклоняются (статус «черновик» вживую не наблюдался). Существующий файл ответа и отправляемый файл крупнее 64 МиБ не принимаются: результат нельзя проверить. Проверено на одном аккаунте за один семестр.lms_open_pageиelk_open_pageотклоняют URL с параметромsesskeyи страницы/mod/assign/с параметромaction: они читают, но не выполняют действий.
Разработка
npm run buildсобирает проект вdist/,npm run dev— в режиме watch.npm run lintпроверяет код линтером и форматтером Biome,npm run formatисправляет то, что можно исправить автоматически.npm run pack:mcpbсобирает пакет Claude Desktop вbuild/hse-mcp-<версия>.mcpb(CI делает то же и прикрепляет пакет к релизу).npm testсобирает проект и запускает тестыnode:test(test/*.test.mjs): сеть, браузер и учётные данные им не нужны. Среди них архитектурный тест: импорты должны соблюдать слои.
Как устроен код и куда добавлять новое — docs/architecture.md, правила
участия — CONTRIBUTING.md.
Лицензия
Available Tools
21 toolselk_get_academic_dataАкадемическая карточка ЕЛКARead-onlyIdempotent
Структурированная академическая карточка студента (lk.hse.ru/api/get-academic-data): рейтинг, GPA, кредиты, КУД, программа обучения, факультет, курс, группа, форма и уровень обучения, статус. Структурированная замена разделу profile в elk_get_section.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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Уведомления ЕЛКBRead-onlyIdempotent
Уведомления ЕЛК (колокольчик в шапке, lk.hse.ru/notification): заголовок, текст, дата, важность, прочитано ли.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Максимум уведомлений |
TDQS
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.
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.
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.
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.
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.
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Расписание через ЕЛКARead-onlyIdempotent
Расписание занятий студента через API Единого личного кабинета (lk.hse.ru/api/get-myschedule) — включая ссылки на онлайн-пары. Работает из ЛЮБОЙ сети (в отличие от RUZ, который доступен только из внутренней сети ВШЭ) — основной источник расписания.
| Name | Required | Description | Default |
|---|---|---|---|
| daysAhead | No | На сколько дней вперёд от сегодня |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | Yes | Дни с занятиями по порядку |
TDQS
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.
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.
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.
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.
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.
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Раздел ЕЛКARead-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 — история заявок на повышенную стипендию; пусто, если заявок не было. Все разделы только читаются: подача заявок не реализована.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Только для tasks: максимум задач (по умолчанию 500) | |
| offset | No | Только для login_history: смещение для пагинации (по умолчанию 0) | |
| section | Yes | Какой раздел прочитать |
TDQS
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.
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.
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.
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.
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.
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Данные аккаунта ЕЛКARead-onlyIdempotent
Базовая структурированная информация об аккаунте в ЕЛК (lk.hse.ru/api/get-user): ФИО, email, роли (студент/ДПО и т.п.). Не содержит академическую карточку (рейтинг, группа, факультет) — за ней используйте elk_get_academic_data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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История заявок в ЕЛКARead-onlyIdempotent
Список всех поданных пользователем заявок в ЕЛК (lk.hse.ru/claim): номер, содержание, сервис, статус (например «Выполнено», «На проверке»), даты создания/обновления, исполнитель и ссылка на форму заявки (если есть). Полезно проверить статус ранее поданных обращений (справки, стипендии, воинский учёт и т.п.) без захода в веб-интерфейс.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Максимум заявок |
TDQS
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.
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.
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.
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.
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.
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Открыть произвольную страницу ЕЛКARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Относительный путь на lk.hse.ru, напр. /claim или /student-services?section=documents |
TDQS
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.
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.
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.
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.
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.
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Поиск сервисов в каталоге ЕЛКARead-onlyIdempotent
Полнотекстовый поиск по каталогу сервисов ЕЛК (lk.hse.ru/api/search/search-all, категория services — 254 сервиса на 2026-09-15): справки, заявки на практику/мобильность/стипендии, запись к психологу, антиплагиат и т.п. Возвращает id, название, описание, прямую ссылку на сервис и релевантность (score). Поле categories в ответе — счётчики совпадений по ВСЕМ категориям поиска (сотрудники/студенты/сервисы/подразделения), даже если сами результаты отданы только по сервисам — так можно понять, есть ли смысл поискать ещё и людей/подразделения по этому запросу.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Максимум результатов | |
| query | Yes | Поисковый запрос, напр. 'справка' или 'стипендия' |
TDQS
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.
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.
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.
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.
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.
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Что изменилось с прошлого разаARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| ack | No | Передавайте ТОЛЬКО ackSeq из последнего ответа hse_changes (число; null не нужен — просто опустите параметр, если ackSeq был null). seq отдельного события подтверждением НЕ является. События до ackSeq считаются полученными и больше не возвращаются. | |
| fresh | No | true — игнорировать кэш (иначе принимаются данные не старше 60 с). | |
| since | No | Журнал за период ("7d", "12h" или дата ISO) вместо неподтверждённого; since сам курсор не двигает (ack в том же вызове двигает). | |
| scopes | No | Области; по умолчанию deadlines, schedule, inbox, claims (без grades). | |
| courses | No | Фильтр курсов для grades: число — id курса, строка — часть названия. |
TDQS
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.
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.
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.
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.
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.
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Сбросить накопленные измененияADestructiveIdempotent
Стирает локальные базы снимков и журнал событий области (или всех областей), после чего следующий hse_changes создаёт базу заново. Полный сброс (без scope) удаляет и копии повреждённого файла (state.json.corrupt-*) и оставшиеся временные файлы. Меняет только локальные файлы. Требует confirm: true.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Область; без неё — все. | |
| confirm | Yes | Должно быть true: подтверждение стирания. |
TDQS
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.
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.
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.
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.
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.
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Сбросить кэш данных ВШЭAIdempotent
Результаты тулов lms_*/elk_* и сводок my_today/my_week/my_deadlines (они собираются из тех же ресурсов) кэшируются в памяти на 2–30 минут, чтобы не открывать браузер заново ради неизменившихся данных. Если нужно гарантированно свежее значение — например, сразу после подачи работы или заявки, — вызовите этот тул, затем повторите нужный запрос. scope сужает сброс до одного сервиса.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Что сбросить: all (по умолчанию) или один сервис |
TDQS
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.
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.
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.
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.
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.
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Материалы курсаARead-onlyIdempotent
Список элементов курса SmartLMS (файлы, задания, тесты, форумы и т.п.) по id курса (см. lms_list_courses). Возвращает тип, название и ссылку каждого элемента.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | id курса на edu.hse.ru (course/view.php?id=...) |
TDQS
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.
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.
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.
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.
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.
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Оценки по курсуARead-onlyIdempotent
Оценки студента по курсу SmartLMS (отчёт по пользователю): items — строки журнала по порядку, у каждой name (название элемента или категории), level (уровень вложенности), path (категории-предки), isCategory и grade (текст оценки; null у категории, «-» если оценки ещё нет). Если вёрстка журнала курса не распознана — ошибка.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | id курса на edu.hse.ru |
TDQS
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.
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.
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.
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.
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.
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Письмо внутренней почты SmartLMSARead-onlyIdempotent
Полный текст письма внутренней почты SmartLMS по id (см. lms_list_messages): текст, курс, отправитель, получатели, вложения (имя файла, размер, ссылка на скачивание).
| Name | Required | Description | Default |
|---|---|---|---|
| messageId | Yes | id письма (из lms_list_messages) |
TDQS
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.
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.
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.
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.
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.
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Задания курсаBRead-onlyIdempotent
Список заданий (mod/assign) курса SmartLMS со сроками сдачи и статусами.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | id курса на edu.hse.ru |
Output Schema
| Name | Required | Description |
|---|---|---|
| assignments | Yes | Строки таблицы заданий курса: заголовок колонки → текст ячейки |
TDQS
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.
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.
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.
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.
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.
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Список курсов SmartLMSARead-onlyIdempotent
Список курсов текущего студента на SmartLMS (edu.hse.ru, Moodle): id, название, категория, даты начала/окончания, процент прохождения, избранное/скрытое. Требует входа через единый SSO ВШЭ (выполняется автоматически, credentials из .env).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| courses | Yes |
TDQS
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.
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.
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.
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.
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.
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Входящие внутренней почты SmartLMSARead-onlyIdempotent
Список входящих писем внутренней почты SmartLMS (плагин local_mail, edu.hse.ru/local/mail) — переписка с преподавателями внутри курсов. Важные объявления и материалы от преподавателей часто приходят именно сюда. Возвращает тему, курс, отправителя, дату, статус прочтения, число вложений.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Максимум писем |
TDQS
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.
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.
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.
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.
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.
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Открыть произвольную страницу SmartLMSARead-onlyIdempotent
Открыть любую страницу edu.hse.ru по относительному пути (например /calendar/view.php) под авторизованной сессией и вернуть видимый текст и ссылки. Полезно для сценариев, не покрытых готовыми тулами.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Относительный путь на edu.hse.ru, напр. /calendar/view.php?view=month |
TDQS
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.
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.
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.
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.
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.
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ДедлайныARead-onlyIdempotent
Что горит: несданные задания и тесты SmartLMS (в том числе просроченные, у которых приём уже закрыт), окна ЕЛК (например, оценка курсов), активные задачи и заявки ЕЛК, ближайшие экзамены/зачёты за days дней вперёд. Элементы без распознанной даты идут в конце с when: null. Возвращает JSON: items — единый список элементов (kind, when, title, course, place, overdue, unread, source, ...), отсортированный: просроченные несданные первыми, затем по времени, затем без даты; sources — статус каждого источника (ok/error/skipped, текст ошибки, warnings). Если источник недоступен (например, ЕЛК не ответил), сводка всё равно возвращается — смотрите sources.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Горизонт в днях вперёд | |
| courses | No | Сузить курсы SmartLMS: число — id курса, строка — часть названия. По умолчанию — все видимые курсы: будущие дедлайны берутся у актуальных (не завершённых), просроченные несданные — у любых видимых. Расписание, окна ЕЛК и остальные источники фильтром не ограничиваются. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| window | Yes | |
| sources | Yes | |
| generatedAt | Yes |
TDQS
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.
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.
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.
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.
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.
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Сводка на сегодняARead-onlyIdempotent
Что у студента сегодня: занятия на сегодня, дедлайны (все просроченные несданные и до конца завтрашнего дня) из SmartLMS и ЕЛК, экзамены/зачёты, непрочитанная внутренняя почта SmartLMS, непрочитанные уведомления ЕЛК, активные заявки и задачи ЕЛК. Возвращает JSON: items — единый список элементов (kind, when, title, course, place, overdue, unread, source, ...), отсортированный: просроченные несданные первыми, затем по времени, затем без даты; sources — статус каждого источника (ok/error/skipped, текст ошибки, warnings). Если источник недоступен (например, ЕЛК не ответил), сводка всё равно возвращается — смотрите sources.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| window | Yes | |
| sources | Yes | |
| generatedAt | Yes |
TDQS
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.
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.
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.
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.
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.
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Сводка на неделюARead-onlyIdempotent
План на ближайшие 7 дней (сегодня + 6): расписание занятий, дедлайны SmartLMS и ЕЛК, экзамены/зачёты, просроченные несданные работы. Без почты и уведомлений — для них my_today. Возвращает JSON: items — единый список элементов (kind, when, title, course, place, overdue, unread, source, ...), отсортированный: просроченные несданные первыми, затем по времени, затем без даты; sources — статус каждого источника (ok/error/skipped, текст ошибки, warnings). Если источник недоступен (например, ЕЛК не ответил), сводка всё равно возвращается — смотрите sources.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| window | Yes | |
| sources | Yes | |
| generatedAt | Yes |
TDQS
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.
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.
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.
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.
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.
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.
18 tool updates
v0.1.2- Changed
elk_get_notifications1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
elk_get_schedule24 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / days / items / properties / lessons / items / additionalPropertiesPrevious value: -trueNew value: +{} - removed
Output schema / properties / days / items / properties / lessons / items / properties / auditorium / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / auditorium / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / begin_time / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / begin_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / building / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / building / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / end_time / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / end_time / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / lecturer / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / lecturer / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / lesson_type / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / lesson_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / parent_schedule / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / parent_schedule / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / url1 / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / url1 / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / url1_description / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / url1_description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / url2 / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / url2 / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / days / items / properties / lessons / items / properties / url2_description / $refRemoved value: -"#/properties/days/items/properties/lessons/items/properties/name" - added
Output schema / properties / days / items / properties / lessons / items / properties / url2_description / typeAdded value: +[ + "string", + "null" +]
- Changed
elk_get_section2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
elk_list_requests1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
elk_open_page1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
elk_search_services1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
hse_changes1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
hse_changes_reset1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
hse_clear_cache1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lms_get_course_materials2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / courseId / maximumAdded value: +9007199254740991
- Changed
lms_get_grades2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / courseId / maximumAdded value: +9007199254740991
- Changed
lms_get_message2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / messageId / maximumAdded value: +9007199254740991
- Changed
lms_list_assignments3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / courseId / maximumAdded value: +9007199254740991 - added
Output schema / properties / assignments / items / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
lms_list_messages1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
lms_open_page1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
my_deadlines4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / courses / items / anyOfPrevious value: -[ - { - "exclusiveMinimum": 0, - "type": "integer" - }, - { - "minLength": 1, - "type": "string" - } -]New value: +[ + { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Output schema / properties / items / items / properties / raw / propertyNamesAdded value: +{ + "type": "string" +} - added
Output schema / properties / sources / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
my_today2 fields changed- added
Output schema / properties / items / items / properties / raw / propertyNamesAdded value: +{ + "type": "string" +} - added
Output schema / properties / sources / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
my_week2 fields changed- added
Output schema / properties / items / items / properties / raw / propertyNamesAdded value: +{ + "type": "string" +} - added
Output schema / properties / sources / propertyNamesAdded value: +{ + "type": "string" +}
21 tool updates
v0.1.1- First observed
elk_get_academic_data - First observed
elk_get_notifications - First observed
elk_get_schedule - First observed
elk_get_section - First observed
elk_get_user_info - First observed
elk_list_requests - First observed
elk_open_page - First observed
elk_search_services - First observed
hse_changes - First observed
hse_changes_reset - First observed
hse_clear_cache - First observed
lms_get_course_materials - First observed
lms_get_grades - First observed
lms_get_message - First observed
lms_list_assignments - First observed
lms_list_courses - First observed
lms_list_messages - First observed
lms_open_page - First observed
my_deadlines - First observed
my_today - First observed
my_week
TDQS
Scored across 21 tools
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.
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.
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.
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
Related MCP Connectors
Your IMAP mailbox as an MCP server: read, search and (if you allow it) organize mail. Open source.
Model Context Protocol server for Studex tools, notifications, and profile integrations
MCP server for the Inistate platform: module discovery, entry management, and activity submission.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAn MCP server for interacting with the MyDy (Moodle-based) LMS, enabling attendance viewing, course browsing, assignment and grade checking, announcement reading, and material downloading.7MIT
- AlicenseNot gradedqualityBmaintenanceA local MCP server that exposes your UPV academic calendar and PoliformaT data to MCP clients, enabling natural language queries for classes, deadlines, announcements, and materials.1MIT
- FlicenseAqualityBmaintenanceMCP 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.201-
- AlicenseAqualityBmaintenanceA 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.191MIT