itmo-mcp
An unofficial MCP server for ITMO student services that lets you query academic, sport, housing, and campus data in natural language, with optional confirmed write actions.
Read your ITMO profile and search/view public profiles of students and staff by ISU.
Get your class schedule for a date range.
View record book grades, per-discipline grade breakdowns, study plan, and current-semester BARS checkpoint scores.
Check physical education status, points history, available lessons, filters, competitions, and ITMO.Widgets sport queues.
Access scholarship/payouts, dormitory status and contracts, room bookings, electronic queue appointments, requests/certificates, and elective campaign status.
Read teacher reviews and subject links from ITMO.Widgets.
With writes explicitly enabled, preview and then confirm sport signups/cancellations, competition registration, room booking/cancellation, request submission/cancellation, and sport queue join/leave.
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., "@itmo-mcp какие пары у меня завтра?"
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.
itmo-mcp
MCP-сервер для сервисов Университета ИТМО: my.itmo.ru и БАРС, а также ITMO.Widgets (отзывы о преподавателях, ссылки предметов, очереди на физкультуру). Подключите его к Claude, Codex, Cursor или другому MCP-клиенту и спрашивайте обычным языком: "какие пары завтра?", "сколько баллов по матану в БАРС?", "куда записаться на волейбол на этой неделе?", "что пишут про преподавателя по матану?".
По умолчанию сервер только читает данные. Запись на физкультуру, бронирование аудиторий и подачу заявок можно включить отдельно (см. "Изменение данных"): каждое действие сначала показывается и выполняется только после вашего подтверждения.
Неофициальный проект. Не связан с Университетом ИТМО. API сервисов может измениться без предупреждения.
Быстрая настройка через агента
Отправьте своему агенту (Claude Code, Codex, Cursor):
Настрой мне MCP-сервер itmo-mcp по README https://github.com/alllexey-dev/itmo-mcpRelated MCP server: MyIIS MCP Server
Что умеет
Инструмент | Что возвращает |
| Ваш профиль: ИСУ, ФИО, факультет, группа, курс |
| Расписание пар за период (по умолчанию 7 дней) |
| Зачётка за семестр: баллы, оценки, тип контроля |
| Разбивка баллов по одной дисциплине зачётки |
| Дисциплины учебного плана за семестр: ЗЕТ, часы, кафедра |
| Баллы БАРС текущего семестра по контрольным точкам |
| Физкультура: баллы, секции, ближайшие занятия, долги |
| История начисления баллов по физкультуре |
| Занятия по физкультуре со свободными местами |
| Виды спорта, корпуса и семестры для фильтров |
| Спортивные соревнования |
| Стипендия и выплаты: суммы по категориям и история |
| Общежитие: статус, договор, баланс и график оплаты |
| Ваши брони аудиторий и коворкингов |
| Записи в электронную очередь |
| Ваши заявки и справки |
| Сроки выбора дисциплин |
| Поиск студентов и сотрудников, профиль по ИСУ |
| Где можно забронировать аудиторию или коворкинг |
| Свободное время комнат на дату (чужие брони только как "занято") |
| Какие справки и заявки можно подать, поля формы |
| Статус и поля поданной заявки |
| Отзывы о преподавателе из ITMO.Widgets и сводка по ним (доступ «Отзывы о преподавателях») |
| Ссылки и чаты предмета от однокурсников (доступ «Ссылки предметов») |
| Ваши очереди на физкультуру в ITMO.Widgets (доступ «Очереди на физкультуру») |
Инструменты widgets_* работают после подключения через приложение ITMO.Widgets (см. "Вход в ИТМО"). Если
нужного доступа нет, инструмент скажет, какой переключатель включить в приложении: Профиль -> Устройства.
Изменение данных
Включается переменной ITMO_MCP_ENABLE_WRITES=true и добавляет инструменты:
Инструмент | Что делает |
| Запись на занятие физкультурой или в секцию на семестр, отписка |
| Регистрация на соревнование или отказ от участия |
| Бронь аудитории или коворкинга, отмена своей брони |
| Подача заявки (например, справки с места учёбы), отмена |
| Очередь ITMO.Widgets на свободное место или автозапись, выход из очереди (записывает телефон) |
| Выполняет подготовленное действие |
Любое изменение идёт в два шага. Инструмент *_preview ничего не меняет: он перечитывает данные, проверяет
правила (свободные места, попытки, пересечения, обязательные поля) и возвращает описание действия и одноразовый
confirmation_token на 10 минут. Агент показывает его вам, и только после вашего согласия вызывает
itmo_confirm_action. Клиенты MCP дополнительно спрашивают разрешение на этот вызов, потому что он помечен
как изменяющий данные.
Чего сервер не делает никогда: не подписывает документы электронной подписью, не платит, не трогает медданные и не подаёт заявления, меняющие статус студента (отчисление, академический отпуск, перевод).
Вход в ИТМО
Через приложение ITMO.Widgets (рекомендуется)
npx -y itmo-mcp setupsetup показывает QR-код, а потом предлагает добавить сервер в Claude Code, Codex и Cursor. Только подключить
без клиентов: npx -y itmo-mcp pair.
В приложении ITMO.Widgets: Профиль -> Устройства -> «Подключить устройство», отсканируйте QR или вставьте ссылку из терминала. Ссылка действует 2 минуты, не пересылайте её.
Сверьте код проверки в терминале и на телефоне, выберите доступы и войдите в ITMO.ID в окне приложения.
Телефон передаёт серверу зашифрованный вход: отдельную сессию ITMO.ID только для этого сервера (на id.itmo.ru/activity это отдельная строка) и токен ITMO.Widgets. Ни пароль, ни cookie телефона сервер не получает.
Команда | Что делает |
| Подключение по QR-коду ( |
|
|
| Доступы, состояние входа в ИТМО и дата его окончания, доступность ITMO.Widgets |
| Новый вход в ИТМО для того же подключения (QR-код ещё раз) |
| Завершает свою сессию ITMO.ID, отключает сервер в ITMO.Widgets и стирает его данные |
Сессия ITMO.ID живёт не больше 90 дней с входа. Когда ИТМО её закрывает, инструменты my.itmo.ru отвечают, что нужен
itmo-mcp renew, а приложение видит это в «Устройствах».Если отключить сервер в приложении, при следующем запросе он сам завершит свою сессию ITMO.ID и сотрёт данные.
Через подключение доступен только my.itmo.ru. Инструменты БАРС работают только с
ITMO_KEYCLOAK_IDENTITYниже, на ваш риск: эта cookie даёт полный доступ к аккаунту ITMO.ID, поэтому приложение её не передаёт.Сервер показывает только инструменты, которые сейчас могут работать:
bars_*- пока естьITMO_KEYCLOAK_IDENTITY, которую ITMO.ID принимает,widgets_*- после подключения к приложению.
Без приложения (переменные окружения)
Переменная | Доступ | Комментарий |
| my.itmo.ru и БАРС | Cookie живёт около 90 дней. Это весь аккаунт: храните как пароль |
| только my.itmo.ru | Токен живёт 30 дней и обновляется сам |
После подключения через приложение my.itmo.ru работает только через свою сессию, а ITMO_KEYCLOAK_IDENTITY нужна
лишь для БАРС. Вход по логину и паролю (ITMO_USERNAME, ITMO_PASSWORD) убран в 0.3.0.
Как получить KEYCLOAK_IDENTITY: войдите на my.itmo.ru, откройте DevTools
(F12) -> Application -> Cookies -> https://id.itmo.ru и скопируйте значение KEYCLOAK_IDENTITY.
ITMO.ID меняет токены при каждом входе. Сервер сохраняет свежие значения и подключение в
~/.config/itmo-mcp/state.json (права 600), поэтому после первого входа переменные можно не обновлять. Папку можно
поменять через ITMO_MCP_STATE_DIR.
Переменная | Назначение |
|
|
| По умолчанию |
| Сервер ITMO.Widgets, по умолчанию |
Подключение
Нужен Node.js 20 или новее.
Claude Desktop
Сначала подключите сервер (npx -y itmo-mcp pair), затем Settings -> Developer -> Edit Config, добавьте в
claude_desktop_config.json (переменные окружения из "Вход в ИТМО" кладутся в "env"):
{
"mcpServers": {
"itmo": {
"command": "npx",
"args": ["-y", "itmo-mcp"]
}
}
}Claude Code
claude mcp add --scope user itmo -- npx -y itmo-mcpCodex
codex mcp add itmo -- npx -y itmo-mcpИли вручную в ~/.codex/config.toml. Первый запуск npx скачивает пакет, поэтому таймаут старта увеличен:
[mcp_servers.itmo]
command = "npx"
args = ["-y", "itmo-mcp"]
startup_timeout_sec = 60Cursor, VS Code и другие клиенты
Используйте ту же команду (npx -y itmo-mcp) и те же переменные окружения в настройках MCP вашего клиента.
Docker вместо Node.js
Подключение сохраняется в томе itmo-mcp:
docker run -it --rm -v itmo-mcp:/state ghcr.io/alllexey-dev/itmo-mcp:v0.3.1 pair{
"mcpServers": {
"itmo": {
"command": "docker",
"args": ["run", "-i", "--rm", "-v", "itmo-mcp:/state", "ghcr.io/alllexey-dev/itmo-mcp:v0.3.1", "--stdio"]
}
}
}Свой сервер (HTTP)
Сервер умеет Streamable HTTP: POST /mcp, health check на GET /healthz. Подключите его так же, как в Docker
выше (... -v itmo-mcp:/state ... pair), затем:
docker run -d --name itmo-mcp -p 8080:8080 \
-e ITMO_MCP_HTTP_TOKEN="$(openssl rand -hex 32)" \
-e ITMO_MCP_HTTP_ALLOWED_HOSTS=mcp.example.com \
-v itmo-mcp:/state \
ghcr.io/alllexey-dev/itmo-mcp:v0.3.1Переменная | Назначение |
| Клиент должен прислать |
| Допустимые значения заголовка |
Один сервер обслуживает один аккаунт ИТМО. Не открывайте его в интернет без токена или прокси с авторизацией: любой, кто до него достучится, увидит ваши данные. Подключение из Claude Code:
claude mcp add --transport http itmo https://mcp.example.com/mcp --header "Authorization: Bearer <токен>"Из Codex (токен берётся из переменной окружения ITMO_MCP_TOKEN):
codex mcp add itmo --url https://mcp.example.com/mcp --bearer-token-env ITMO_MCP_TOKENПриватность
Сервер обращается напрямую к
id.itmo.ru,my.itmo.ruиbars.itmo.ru, а после подключения ещё к ITMO.Widgets (widgets.alllexey.dev): за отзывами, ссылками и очередями и чтобы сообщить, работает ли его вход в ИТМО. Токены ИТМО к ITMO.Widgets не уходят.Ответы инструментов попадают в контекст модели и, значит, к провайдеру LLM, которым вы пользуетесь.
Токены и cookie не попадают в ответы инструментов и в логи.
OpenAPI и клиент
В openapi/ лежат описания API (OpenAPI 3.1), восстановленные по веб-клиентам и проверенные на живых ответах:
openapi/my-itmo.yaml: расписание, зачётка, учебный план, физкультура, финансы, общежитие и другое;openapi/bars.yaml: БАРС.
По ним сгенерирован типизированный клиент на openapi-fetch, который можно использовать как библиотеку:
import { createToolDeps, loadConfig, result } from "itmo-mcp";
const { my } = createToolDeps(loadConfig());
const requests = await result("getMyRequests", my.GET("/api/requests/my"));Исследование API ИТМО
В папке research/ собрана документация по студенческим сервисам ИТМО (my.itmo.ru, БАРС, бэкенды
мобильного приложения и другие): откуда данные, как устроена авторизация, карта хостов и отдельный документ на
каждый сервис с таблицей ручек и статусом проверки. Там же лежат исследовательские OpenAPI-спецификации для ручек,
которых нет в контракте выше. Это справочный материал, а не часть сервера.
Разработка
npm install
npm test # юнит-тесты и проверка спек на фикстурах
npm run lint:spec # линтер OpenAPI
npm run gen # перегенерировать src/generated после правки openapi/
npm run verify:live # сверить спеки с живыми ответами (нужны ITMO_* переменные)
npm run buildverify:live выводит только названия операций, HTTP-статусы и пути ошибок схемы, без самих данных.
Новые фикстуры добавляйте только после scripts/sanitize-fixture.ts, он убирает персональные данные.
Изменения
См. CHANGELOG.md.
Лицензия
MIT
Available Tools
19 toolsbars_get_scoresBARS pointsARead-onlyIdempotent
Current-semester points from BARS (bars.itmo.ru): total per discipline and points per checkpoint (labs, tests, exam) with min/max. Optionally filter by discipline name.
Inputs: discipline.
itmo_get_dormitoryDormitoryARead-onlyIdempotent
Dormitory status (queue place, assigned dormitory and address) and housing contracts with balance and payment schedule.
Inputs: no named parameters.
itmo_get_election_statusDiscipline election campaignBRead-onlyIdempotent
Status and dates of the current elective discipline selection campaign.
Inputs: no named parameters.
itmo_get_grade_detailsGrade breakdownARead-onlyIdempotent
Points breakdown (assessments, min/max points, received points) for one record book entry.
Inputs: entry_id (required).
itmo_get_gradesRecord book gradesARead-onlyIdempotent
Final grades from the ITMO record book (zachetka) for one semester: points, grade, assessment type and date. Defaults to the current semester. Use entry_id with itmo_get_grade_details for the points breakdown.
Inputs: semester.
itmo_get_personITMO person by ISUARead-onlyIdempotent
Public profile of an ITMO student or employee by ISU number: positions, contacts, education.
Inputs: isu (required).
itmo_get_profileMy ITMO profileARead-onlyIdempotent
Profile of the signed-in ITMO student: ISU number, full name, faculty, group, course.
Inputs: no named parameters.
itmo_get_queue_appointmentsElectronic queue appointmentsCRead-onlyIdempotent
Appointments in the ITMO electronic queue (dean's office, student office, etc.).
Inputs: include_past.
itmo_get_requestsMy requestsBRead-onlyIdempotent
Applications and certificate requests submitted through my.itmo.ru with their status.
Inputs: no named parameters.
itmo_get_room_bookingsMy room bookingsARead-onlyIdempotent
Rooms (meeting rooms, coworkings, classrooms) booked by or shared with the student.
Inputs: no named parameters.
itmo_get_scheduleClass scheduleARead-onlyIdempotent
Personal ITMO class timetable (lectures, practices, labs, exams, consultations) for a date range. Defaults to the next 7 days starting today (Moscow time). Days without classes are omitted.
Inputs: date_to, date_from.
itmo_get_scholarshipScholarship and payoutsARead-onlyIdempotent
Scholarship and other payouts: totals by category for a period and individual payments with breakdown. Defaults to the last 365 days.
Inputs: date_to, date_from.
itmo_get_sport_competitionsSport competitionsBRead-onlyIdempotent
University sports competitions with dates, venue, free places and registration status.
Inputs: sport_type_id.
itmo_get_sport_filtersSport filters and semestersBRead-onlyIdempotent
Ids and names of sport types, buildings and sports semesters (optionally sections and teachers) for other sport tools.
Inputs: include_sections_and_teachers.
itmo_get_sport_points_historySport points historyBRead-onlyIdempotent
Every physical education point award (lessons, competitions) for a sports semester.
Inputs: semester_id.
itmo_get_sport_scheduleSport lessons available for enrollmentARead-onlyIdempotent
Physical education lessons open for enrollment with free places and enrollment restrictions. Defaults to 7 days from today. Filter ids come from itmo_get_sport_filters. Read-only: does not enroll.
Inputs: limit, date_to, section, date_from, +4 more.
itmo_get_sport_statusPhysical education statusARead-onlyIdempotent
Physical education (sport) summary: points this semester, enrolled sections, upcoming enrolled lessons for 14 days, enrollment attempts, debt and medical health group.
Inputs: no named parameters.
itmo_get_study_planStudy planARead-onlyIdempotent
Disciplines of the student's study plan for one semester: credits, hours by activity, department, language and whether it is an elective. Defaults to the current semester.
Inputs: semester.
itmo_search_peopleSearch ITMO peopleARead-onlyIdempotent
Search ITMO students and employees by name, ISU number or other attributes. Returns ISU numbers, contacts and positions.
Inputs: query (required), limit, offset.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 19 tools
Most tools target distinct resources or actions (people, schedule, sport, dormitory, etc.). The main overlap is among the three grade/points tools (itmo_get_grades, itmo_get_grade_details, bars_get_scores), which come from different systems and could confuse an agent without careful reading.
All tools use snake_case verb_noun names, but 18 of 19 are prefixed with itmo_, while bars_get_scores breaks the server prefix. This minor inconsistency is the only deviation.
19 tools is borderline heavy (rubric: 16-25 feels heavy). While each tool covers a distinct facet of the student portal, the count could be reduced by consolidating some sport-related tools.
The surface is almost entirely read-only; there are no create/update/delete or action tools (e.g., enrolling in sport, submitting requests, booking rooms). This is a significant gap for a student portal domain.
Related MCP Connectors
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Your Gmail, Calendar, Drive, GitHub, Oura, wallet and confirmed profile facts in any MCP client.
Zen Planner MCP server for ChatGPT, Claude and any AI agent: list members, book class, record attendance, enroll in membership and list failed payments in your own Zen Planner account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Zen Planner yourself; Cotlet does not store your password and you need no Zen Planner API key. About the official Zen Planner API: Yes, but only for partners: Zen Planner has an API on the Daxko Partners portal, and its docs say "Contact your Daxko sales representative to request access" (checked 11 Oct 2026). Studios cannot create a key themselves in Zen Planner Studio. Setup and FAQ: https://cotlet.dev/integrations/zen-planner-api-mcp-server
Thought Industries MCP server for ChatGPT, Claude and any AI agent: list learners, enroll learner in course, import and invite learners, read content actions log, set content status and add learner to waitlist in your own Thought Industries account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Thought Industries yourself; Cotlet does not store your password and you need no Thought Industries API key. About the official Thought Industries API: Thought Industries has a REST API and a GraphQL API, but no MCP server you can connect today (checked 23 Oct 2026). Both APIs need a key an admin creates under Settings > Security, and the Claude plugin lists "a Thought Industries instance with API access enabled" as a prerequisite. Setup and FAQ: https://cotlet.dev/integrations/thought-industries-api-mcp-server
Related MCP Servers
- AlicenseBqualityBmaintenanceUnofficial local MCP server for Istanbul Technical University (İTÜ) students. Reads your own Ninova LMS, OBS and Portal data with your own account: assignments and deadlines, grades and cumulative GPA simulation, schedule and exams, registration, course archive, library and campus services. Read-only by default; the two write tools ask for confirmation.10868 PyPI16MIT
- AlicenseAqualityBmaintenanceProvides LLM clients with real-time access to BSUIR class schedules, academic weeks, student groups, and teachers through a read-only MCP interface, enabling natural-language queries about lessons and timetable information.22MIT
- FlicenseNot gradedqualityCmaintenanceEnables querying ITIS KFU schedules and university information through MCP tools that search KFU websites, read pages, and retrieve group schedules.-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to retrieve and work with Moscow Electronic School data, including schedules, homework, grades, rankings, school info, meals, passes, olympiads, and portfolio, via authenticated MCP tools.MIT