Skip to main content
Glama

BIT101 MCP

Локальный сервис Model Context Protocol (MCP) только для чтения для студентов Пекинского технологического института. Он преобразует контент сообщества BIT101, отзывы о курсах, личное расписание, оценки и календарь Lexue в структурированные данные, понятные агенту, позволяя задавать вопросы на естественном языке напрямую.

[!IMPORTANT] Этот проект является неофициальным общественным проектом и не имеет отношения к Пекинскому технологическому институту или официальному BIT101. Windows прошёл основные проверки на реальном оборудовании, Fedora 43 + niri подтверждён как работающий; проект всё ещё находится на стадии MVP. Перед использованием прочтите Аутентификация, безопасность и конфиденциальность.

Возможности

  • Сводка сегодняшних постов BIT101 или поиск исторических обсуждений по ключевым словам

  • Поиск курсов, преподавателей и отзывов студентов за прошлые годы

  • Получение расписания на сегодня, эту неделю, следующую неделю или указанный семестр

  • Запрос оценок, кредитов, среднего балла и максимального балла по группе (если предоставлено вышестоящей системой)

  • Запрос событий календаря Lexue на будущий период

  • Комбинирование данных из разных источников для ответа на вопросы, например: «Как студенты оценивают преподавателей моих курсов на следующий семестр?»

Все инструменты доступны только для чтения. Проект не может публиковать посты, ставить лайки, комментировать, сдавать задания, изменять оценки или модифицировать любые данные университета.

Related MCP server: iGuat-MCP

Демонстрация на реальном оборудовании

Следующие скриншоты сделаны при реальных вызовах OpenCode cli на Windows. Конкретные ответы генерируются используемой моделью на основе данных, возвращаемых MCP, не отражают мнение автора проекта и могут меняться вместе с обновлениями моделей и данных.

Сводка сегодняшних постов

Агент вызывает list_today_posts для получения постов за день, затем формирует краткую сводку на основе заголовков, содержимого и активности.

Сводка сегодняшних постов BIT101

Отзывы о преподавателях и курсах

Агент сначала ищет курсы, соответствующие преподавателю, затем вызывает get_course_reviews для агрегации метаданных курса, оценок, отзывов и исторической информации.

Агрегация отзывов о преподавателях и курсах

Обсуждение профессиональных направлений

Когда в каталоге курсов нет точного совпадения, агент может продолжить поиск постов BIT101 и прочитать соответствующие обсуждения, демонстрируя совместное использование нескольких инструментов MCP.

Сводка обсуждений по профессиональным направлениям

Календарь Lexue

Агент может запрашивать события Lexue за 7–90 дней. Если в действующем календаре нет ближайших задач, корректно возвращается пустой список, а не ошибочная интерпретация «нет задач» как сбоя интерфейса.

Запрос ближайших задач Lexue

Подготовка перед использованием

Рекомендуемое окружение:

  • Windows 10/11 или Linux с настольным браузером и доступным системным keyring (Fedora 43 + niri проверены)

  • Python 3.11 или новее

  • uv

  • Клиент с поддержкой локального stdio MCP, например Codex, OpenCode, Cursor или Claude Code

  • Учётная запись BIT101

  • Для запроса расписания и оценок также требуется учётная запись единой аутентификации Пекинского технологического института; для некоторых входов может потребоваться SMS-подтверждение

  • Для запроса Lexue необходимо один раз экспортировать адрес подписки на личный календарь из Lexue

Установка

Расскажите своему агенту (рекомендуется)

Если ваш агент может выполнять команды терминала и изменять собственную конфигурацию MCP, вы можете напрямую отправить ему следующий текст:

请帮我安装并配置 BIT101 MCP:
https://github.com/tiny-paris/BIT101-mcp

要求:
1. 先阅读仓库 README,尤其是“认证、安全与隐私”部分,并告诉我它会访问哪些服务。
2. 检查本机是否安装 Python 3.11+、Git 和 uv;缺少时说明后再安装。
3. 优先使用以下命令安装为用户级工具:
   uv tool install "git+https://github.com/tiny-paris/BIT101-mcp.git"
4. 识别我当前使用的 MCP 客户端,将 bit101-mcp 配置为用户级/全局 stdio MCP,
   名称使用 bit101,单次工具执行超时至少设置为 360 秒。
5. 如果找不到命令,运行 uv tool dir --bin,并在 MCP 配置中使用
   bit101-mcp(Windows 为 bit101-mcp.exe)的绝对路径。
6. 重启或重新加载 MCP,验证服务器已连接并能列出工具。
7. 不要在聊天、命令行参数、配置文件或环境变量中向我索要或写入账号、密码、
   短信验证码、Cookie、token 或乐学订阅 URL。需要认证时,只让我在 MCP 自动打开的
   127.0.0.1 临时页面中操作。
8. 不要修改默认上游地址。完成后告诉我修改了哪些配置文件以及验证结果。

После завершения установки агентом просто задайте в новом диалоге вопрос «Суммируй сегодняшние посты BIT101», чтобы запустить первую аутентификацию по требованию.

Установка из исходного кода

После публикации репозитория можно выполнить:

git clone https://github.com/tiny-paris/BIT101-mcp.git
cd BIT101-mcp
uv sync --all-groups
uv tool install .

uv tool install . установит bit101-mcp как пользовательскую команду. Просмотреть каталог исполняемых файлов uv можно следующей командой:

uv tool dir --bin

Если MCP-клиент не находит bit101-mcp, перезапустите клиент или укажите в конфигурации абсолютный путь к bit101-mcp.exe в этом каталоге.

Запуск только в каталоге исходного кода

Для разработки или тестирования можно не устанавливать команду:

uv sync --all-groups
uv run bit101-mcp

После нормального запуска stdio MCP молча ожидает сообщения протокола — «зависание» — это нормально. Не используйте его как обычную интерактивную команду и не вводите в его терминал учётные данные.

[!NOTE] Простой uvx bit101-mcp станет доступен только после публикации проекта на PyPI. Текущий README не предполагает, что пакет PyPI уже существует.

Описание зависимостей

Проект объявляет 7 прямых зависимостей времени выполнения. Не все они «обязательны по протоколу MCP», а являются компонентами, необходимыми для текущей полной функциональности:

Зависимость

Назначение в проекте

Можно ли удалить сейчас

mcp

Сервер stdio MCP, регистрация инструментов, контекст и типы протокола

Нет; это основная зависимость

httpx

Асинхронный/синхронный HTTPS-клиент для BIT101, BIT-Login и календаря Lexue

Нет; все данные и аутентификация требуют сети

keyring

Сохранение сессий и адреса подписки Lexue в хранилище учётных данных ОС

Нет; без него невозможно безопасно переиспользовать сессии между процессами

icalendar

Проверка и разбор экспортированных ICS/iCalendar из Lexue

Нет; используется функцией Lexue и при импорте при запуске

python-dateutil

Развёртывание правил повторения (RRULE) в календаре Lexue

Нет; необходимо для периодических событий

pydantic

Диапазоны параметров инструментов MCP и JSON-схемы, например количество постов, смещение недели, дни запроса

Нет; используется напрямую в коде, и MCP SDK также основан на нём

tzdata

Предоставление базы данных часового пояса Asia/Shanghai для zoneinfo на Windows

Не рекомендуется удалять; иначе в некоторых средах Windows/Python невозможно корректно вычислить «сегодня» и учебные недели

Таким образом, для текущей однопакетной версии все 7 являются зависимостями времени выполнения; но с функциональной точки зрения icalendar и python-dateutil обслуживают только Lexue, и в будущем при разделении на опциональные функции их можно сделать дополнительными зависимостями. Сейчас разделение усложнит установку и обработку ошибок, а экономия объёма будет незначительной.

В uv.lock также будут видны косвенные зависимости, такие как anyio, httpcore, certifi — они автоматически подтягиваются указанными библиотеками, не являются верхнеуровневыми компонентами, вызываемыми проектом напрямую, и не должны устанавливаться или удаляться вручную по отдельности.

Следующие зависимости используются только для разработки и публикации и не устанавливаются как обычные зависимости времени выполнения:

Зависимость

Назначение

pytest, pytest-asyncio

Автоматизированное тестирование

ruff

Проверка и форматирование кода

hatchling

Сборка исходного пакета и wheel

Настройка MCP-клиента

Первая аутентификация в университете может занять до нескольких минут, поэтому рекомендуется установить тайм-аут одного вызова инструмента в 360 секунд. После настройки необходимо перезапустить MCP-клиент, чтобы он запустил новый процесс сервиса.

Codex

Codex CLI, расширение Codex IDE и хост Codex в настольном ChatGPT используют общую конфигурацию MCP в config.toml. Официальная документация: Codex MCP docs.

Сначала добавьте через CLI:

codex mcp add bit101 -- bit101-mcp
codex mcp list

Затем проверьте пользовательский %USERPROFILE%\.codex\config.toml и добавьте тайм-аут инструментов:

[mcp_servers.bit101]
command = "bit101-mcp"
tool_timeout_sec = 360

Если нужно включить только в доверенном проекте, поместите ту же конфигурацию в .codex/config.toml этого проекта. Пользовательская конфигурация доступна в любом каталоге и в новых диалогах.

Если команда не в PATH Codex, можно указать абсолютный путь:

[mcp_servers.bit101]
command = 'C:\path\to\bit101-mcp.exe'
tool_timeout_sec = 360

OpenCode

Проект протестирован на реальном оборудовании Windows со следующей традиционной конфигурацией OpenCode. opencode.json в корне проекта действует только для этого проекта; для использования в любом каталоге поместите его в пользовательский ~/.config/opencode/opencode.json (на Windows обычно %USERPROFILE%\.config\opencode\opencode.json).

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bit101": {
      "type": "local",
      "command": ["bit101-mcp"],
      "enabled": true,
      "timeout": 360000
    }
  }
}

Проверка подключения:

opencode mcp list

Если запуск возможен только в каталоге исходного кода, обычно это означает, что в конфигурации используется относительная команда и нет глобальной установки. Установите bit101-mcp или измените command на абсолютный путь .venv\Scripts\bit101-mcp.exe.

Структура конфигурации OpenCode V2 отличается: сервисы находятся в mcp.servers, тайм-аут выполнения — в mcp.timeout.execution. Следуйте официальной документации OpenCode MCP:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "timeout": {
      "execution": 360000
    },
    "servers": {
      "bit101": {
        "type": "local",
        "command": ["bit101-mcp"]
      }
    }
  }
}

Cursor

Согласно документации Cursor MCP, глобальная конфигурация находится в ~/.cursor/mcp.json, конфигурация проекта — в .cursor/mcp.json:

{
  "mcpServers": {
    "bit101": {
      "command": "bit101-mcp",
      "args": []
    }
  }
}

После сохранения перезапустите Cursor и убедитесь, что bit101 включён в списке доступных инструментов агента.

Claude Code

Следуя документации Claude Code MCP, добавьте пользовательский stdio-сервис:

claude mcp add --scope user bit101 -- bit101-mcp
claude mcp list

Общая конфигурация stdio

Другим MCP-клиентам достаточно настроить один локальный stdio-процесс:

{
  "command": "bit101-mcp",
  "args": []
}

Не записывайте учётные данные, пароли, cookie, токены или URL Lexue в конфигурацию MCP, переменные окружения или параметры инструментов.

Начало работы

После настройки просто задавайте вопросы в диалоге с агентом — запускать фоновый сервис вручную не нужно. Например:

Сообщество и курсы BIT101

总结一下今天 BIT101 都有哪些帖子。
查找最近关于“数据结构”的讨论。
如何评价某某老师的某门课?请区分普遍评价和少数意见。
查找“特立自动化”相关讨论,并列出信息来源。

Расписание и оценки

我今天有什么课?
我下周有什么课?按实际日期和开始时间排序。
列出本学期完整课表。
列出我的所有成绩,包括课程、学期、学分、成绩、班级平均分和最高分。

При запросе «эта/следующая неделя» сервер вычисляет точный номер недели на основе текущей даты и возвращает полное время starts_at, ends_at и т.д.; агенту не нужно самостоятельно угадывать учебные недели или время занятий.

Lexue

未来 14 天有哪些乐学任务?按截止时间排序。
看看未来 30 天的乐学日历。

Доступные инструменты

Инструмент

Назначение

Требуемая аутентификация

list_today_posts

Получение постов BIT101, опубликованных сегодня в часовом поясе Шанхая

BIT101

search_posts

Поиск постов BIT101

BIT101

get_post

Чтение указанного поста и связанной информации

BIT101

search_courses

Поиск курсов и преподавателей

BIT101

get_course_reviews

Агрегация курсов, преподавателей, отзывов и исторических курсов

BIT101

get_today_schedule

Получение занятий на сегодня

Единая аутентификация университета

get_week_schedule

Получение расписания на эту, следующую или относительную неделю с датами

Единая аутентификация университета

get_schedule

Получение полного расписания на текущий или указанный семестр

Единая аутентификация университета

get_scores

Получение оценок и доступной статистики по группе

Единая аутентификация университета

get_upcoming_lexue_tasks

Разбор событий календаря Lexue на 1–90 дней вперёд

Аутентификация университета + адрес подписки Lexue

Успешные результаты единообразно имеют вид:

{
  "ok": true,
  "data": {}
}

Результаты ошибок не содержат стеков вызовов вышестоящих систем или информацию об аутентификации:

{
  "ok": false,
  "error": {
    "code": "UPSTREAM_UNAVAILABLE",
    "service": "bit101",
    "message": "BIT101 is temporarily unavailable.",
    "retryable": true
  }
}

Технические принципы

Ядро состоит из четырёх уровней:

  1. Уровень инструментов MCP: предоставляет только пользовательские концепции — посты, курсы, расписание, оценки и задачи; не раскрывает cookie, токены вызова или внутренние идентификаторы сервисов.

  2. Уровень клиентов: отдельно обрабатывает API BIT101 и шлюз данных университета; при сбое запроса определяет, истекла ли сессия, и выполняет только одну восстанавливаемую повторную попытку.

  3. Уровень стандартизации: преобразует форматы разных вышестоящих систем в стабильные, JSON-совместимые поля; отвечает за разбор дат в часовом поясе Шанхая, учебных недель, времени занятий, оценок и событий ICS.

  4. Уровень аутентификации и хранения: открывает локальную страницу только при необходимости; пароли не попадают в параметры MCP; после успеха сохраняется только переиспользуемая сессия.

MCP использует stdio transport. Стандартный вывод отправляет только данные протокола MCP, журналы записываются только в стандартный поток ошибок, чтобы логи не нарушали протокольную связь.

Процесс аутентификации

Почему нельзя напрямую переиспользовать вход BIT101 в браузере?

Cookie браузера принадлежат его собственному защищённому пространству; MCP — это отдельный локальный процесс. Проект намеренно не читает базы cookie Chrome/Edge и не требует установки расширений браузера. Это добавляет одну лишнюю первичную аутентификацию, но позволяет избежать сканирования MCP всех учётных данных браузера пользователя.

Открытие нового диалога с агентом само по себе не очищает состояние входа. При запуске MCP считывает и проверяет сохранённые сессии; повторный вход выполняется только если сессия отсутствует, вышестоящая система признала её недействительной, временный вызов аутентификационного шлюза истёк или хранилище учётных данных системы недоступно.

BIT101

При первом вызове инструмента сообщества:

  1. MCP запускает временную страницу на случайном порту 127.0.0.1.

  2. Пользователь вводит номер студенческого билета и пароль BIT101 на локальной странице.

  3. Локальный процесс обрабатывает пароль по существующему протоколу входа BIT101 и отправляет HTTPS-запрос к API BIT101.

  4. После успешного входа в хранилище учётных данных системы сохраняется только возвращённая сессия BIT101; исходный пароль не сохраняется.

  5. Временная страница закрывается, исходный вызов инструмента продолжает выполнение.

Расписание и оценки университета

Расписание и оценки поступают из персонального сервиса данных университета и не используют тот же «ключ», что и сессия сообщества BIT101. При первом вызове локальная страница собирает учётные данные единой аутентификации, пароль и, при необходимости, SMS-код, и отправляет их по HTTPS существующему REST-шлюзу BIT-Login. MCP сохраняет краткосрочную сессию вызова, возвращённую шлюзом, но не сохраняет пароль университета.

Календарь Lexue

Текущий REST-шлюз BIT-Login не предоставляет интерфейс календаря Lexue, который можно было бы вызывать из этого проекта, и проект не перереализует CAS/SSO университета. Поэтому в MVP пользователю необходимо один раз сгенерировать частный адрес подписки на странице Календарь → Экспорт календаря в Lexue и вставить его на локальной странице подключения.

Страница подключения фактически загружает и проверяет содержимое iCalendar; только действующая подписка отображает Connected; обычные страницы calendar/view.php отклоняются. Адрес подписки не попадает в результаты агента или инструментов MCP и сохраняется в хранилище учётных данных системы. Действительный календарь без ближайших событий возвращает пустой список.

Аутентификация, безопасность и конфиденциальность

Краткий вывод

Этот проект снижает риск попадания паролей в агента, историю чата и журналы, но не может гарантировать «нулевой риск». Установка локального MCP эквивалентна установке локальной программы с доступом в сеть; пользователь должен доверять исходному коду проекта, установочным пакетам, зависимостям и настроенным удалённым сервисам аутентификации.

Особенно важно различать два утверждения:

  • Пароли не отправляются агенту/LLM: это явно реализованная граница проекта.

  • Пароли существуют только на этом компьютере: это не так. Пароль единой аутентификации университета должен быть отправлен локальным MCP по HTTPS настроенному удалённому шлюзу BIT-Login для завершения аутентификации.

Какая информация куда попадает?

Информация

Кто имеет доступ

Сохраняется ли

Пароль BIT101

Локальный код аутентификации; обрабатывается по протоколу вышестоящей системы и отправляется в API BIT101

Пароль не сохраняется

Пароль единой аутентификации университета

Локальный код аутентификации и настроенный шлюз BIT-Login

Не сохраняется

SMS-код подтверждения

Локальный код аутентификации и шлюз BIT-Login

Не сохраняется

Сессия BIT101/университета

Локальный MCP и соответствующая вышестоящая система

Хранилище учётных данных ОС

Частный адрес подписки Lexue

Локальный MCP и сервис календаря bit.edu.cn

Хранилище учётных данных ОС

Посты, курсы, расписание, оценки, события Lexue

MCP и текущий агент

Попадает в контекст текущего агента

Адреса вышестоящих систем по умолчанию:

  • API BIT101: https://bit101.flwfdd.xyz

  • REST BIT-Login: https://login.bit101.flwfdd.xyz

HTTPS защищает от обычного перехвата в сети, но не заменяет доверие к оператору сервера. Пользователи, которых беспокоит прохождение пароля университета через удалённый шлюз, не должны включать инструменты расписания и оценок.

Реализованные меры защиты

  • Временный HTTP-сервис привязан только к 127.0.0.1 и использует случайный порт, назначенный ОС.

  • Каждая аутентификация использует 256-битный случайный state с сравнением за постоянное время для защиты от поддельных отправок.

  • Страница отключает кэширование, внешний контент, iframe, referrer и угадывание MIME-типов.

  • Страница прекращает прослушивание после успеха, отмены или тайм-аута.

  • Пароли и коды подтверждения не записываются в файлы; код очищает ссылки на соответствующие переменные как можно скорее после запроса.

  • Сессии записываются через Python keyring в хранилище учётных данных ОС (Windows Credential Manager или Secret Service/keyring на Linux); при недоступности хранятся только в памяти текущего процесса, без отката к файлам в открытом виде.

  • Журналы маскируют пароли, коды подтверждения, cookie, Bearer-токены и заголовки Authorization.

  • Адрес Lexue должен использовать HTTPS в домене bit.edu.cn и возвращать действительный iCalendar.

  • Все инструменты помечены как доступные только для чтения и не предоставляют возможности изменять данные университета или сообщества.

На что следует обратить внимание пользователю

  • Устанавливайте только из доверенных репозиториев или доверенных страниц релизов и по возможности проверяйте исходный код и хеши релизов.

  • Адрес локальной страницы аутентификации должен начинаться с http://127.0.0.1:<случайный порт>/connect.

  • Никогда не отправляйте пароли, коды подтверждения, cookie, токены или URL Lexue в поле чата агента, параметры MCP, Issues или журналы.

  • Не используйте личные учётные данные университета на ненадёжных общедоступных компьютерах.

  • URL подписки Lexue — это частная ссылка «получил — значит можешь читать», её нужно защищать как пароль; при подозрении на утечку перегенерируйте её в Lexue.

  • При запросе оценок и расписания соответствующие данные предоставляются текущему агенту. Самостоятельно решайте, включать ли эти функции, исходя из политики данных используемой модели и клиента.

Очистка локальных сессий

На Windows откройте Панель управления → Диспетчер учётных данных → Учётные данные Windows; на Linux откройте инструмент управления Secret Service текущего окружения рабочего стола (обычно GNOME Keyring или KDE Wallet). Удалите следующие записи с именем сервиса bit101-mcp:

  • bit101-session

  • school-session

  • lexue-calendar-url

После удаления следующий вызов соответствующего инструмента потребует повторной аутентификации. Удаление Python-пакета не удаляет эти системные учётные данные автоматически. Если на Linux нет доступного бэкенда keyring, сессии хранятся только в памяти текущего процесса, и после перезапуска MCP потребуется повторный вход.

Параметры конфигурации

Неконфиденциальные параметры настраиваются только через переменные окружения:

Переменная

Значение по умолчанию

Назначение

BIT101_API_URL

https://bit101.flwfdd.xyz

Корневой адрес API BIT101

BIT101_SCHOOL_API_URL

https://login.bit101.flwfdd.xyz

Корневой адрес REST BIT-Login

BIT101_REQUEST_TIMEOUT

30

Тайм-аут одного HTTP-запроса к вышестоящей системе, в секундах

BIT101_AUTH_TIMEOUT

300

Максимальное время ожидания локальной страницы аутентификации, в секундах

Учётные данные и сессии нельзя настраивать через параметры инструментов или переменные окружения. Изменение адресов вышестоящих систем означает доверие новому оператору сервиса — используйте с осторожностью.

Часто задаваемые вопросы

Нужно ли запускать агента в каталоге проекта?

Нет. После установки команды через uv tool install . и записи MCP в пользовательскую конфигурацию клиента можно использовать из любого каталога. opencode.json, .cursor/mcp.json или .codex/config.toml в корне проекта действуют только для соответствующего проекта.

Почему при первом использовании открывается браузер?

Аутентификация запускается по требованию. Первый запрос постов требует сессию BIT101; первый запрос расписания/оценок требует сессию университета; первый запрос Lexue также требует частную подписку на календарь. Пароли и адрес подписки не могут проходить через чат, поэтому используется временная локальная страница.

Почему MCP всё равно требует вход, если веб-страница BIT101 уже авторизована?

Сессия веб-страницы хранится в cookie браузера. MCP не читает cookie браузера, поэтому ему нужно создать собственную минимальную сессию. Это жертвует удобством первого входа, но избегает прямого доступа ко всем данным входа браузера.

Почему в новом диалоге иногда снова требуется вход?

Новый диалог не очищает сессии активно, но MCP проверяет сессии вышестоящих систем. Повторный вход происходит при истечении сессии, её отзыве сервером, недействительности вызова аутентификационного шлюза или недоступности хранилища учётных данных системы. Если сразу после успешного входа и перезапуска снова появляется запрос, проверьте наличие записей bit101-mcp в хранилище учётных данных системы.

Lexue показывает Connected, но задач нет — почему?

Если адрес подписки прошёл проверку iCalendar, пустой список обычно означает, что в выбранном диапазоне времени действительно нет событий. Можно расширить диапазон запроса с 7 до 30 дней для проверки.

Почему университетские инструменты работают медленно?

Первая аутентификация университета, SMS-подтверждение и получение деталей оценок могут занять много времени. Установите тайм-аут инструментов MCP в 360 секунд и дождитесь завершения текущего вызова; не запускайте несколько университетских инструментов одновременно.

Что делать, если команда bit101-mcp не найдена?

Выполните uv tool dir --bin, чтобы найти каталог установки, добавьте его в PATH или укажите абсолютный путь к bit101-mcp.exe в конфигурации MCP. После изменения перезапустите клиент.

Коды ошибок

Код

Значение

BIT101_AUTH_REQUIRED

Требуется установить сессию BIT101

SCHOOL_AUTH_REQUIRED

Требуется установить сессию университета

AUTH_EXPIRED

Сохранённая сессия истекла

AUTH_FAILED

Вход не выполнен или учётные данные не приняты вышестоящей системой

AUTH_TIMEOUT

Истекло время ожидания локальной страницы аутентификации

LEXUE_SETUP_REQUIRED

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

NOT_FOUND

Указанный пост и т.п. не существует

UPSTREAM_UNAVAILABLE

Вышестоящий сервис временно недоступен, можно повторить позже

INVALID_RESPONSE

Вышестоящая система вернула нераспознаваемые данные

Все ошибки проходят очистку и не возвращают пароли, cookie, токены, заголовки Authorization, исходные стеки вызовов или полные чувствительные запросы.

Разработка

Структура проекта:

src/bit101_mcp/
├── server.py           # MCP 入口、工具注册和服务器说明
├── tools/              # Agent 可见的只读工具
├── clients/            # BIT101 与学校上游客户端
├── auth/               # 本地浏览器认证、状态机和凭据存储
├── models/             # 数据标准化、周次和 ICS 解析
└── logging_utils.py    # stderr 日志和秘密脱敏

Установка зависимостей для разработки и запуск проверок:

uv sync --all-groups
uv run ruff check .
uv run ruff format --check .
uv build

Перед релизом мейнтейнеры проверяют стандартизацию данных, состояние аутентификации, маскирование секретов и процесс повторных попыток с помощью мок-тестов, не распространяемых с публичным репозиторием; эти тесты не требуют реальных учётных записей. Интеграционные тесты с реальными аккаунтами остаются ручными и опциональными; тестовые учётные данные не должны попадать в репозиторий или CI.

Благодарности

Спасибо проекту BIT101 и всем его контрибьюторам. Долгосрочно поддерживаемые сообщество, отзывы о курсах, интерфейсы данных кампуса и инструменты аутентификации, созданные старшими товарищами, значительно облегчили студенческую жизнь и заложили важную основу для этого проекта.

Этот проект особенно ссылается на или использует интерфейсы и документацию следующих проектов:

BIT101 MCP — это независимо разработанный неофициальный MCP-клиент, взаимодействующий с соответствующими сервисами через сетевые интерфейсы. Лицензия MIT этого репозитория применяется только к оригинальному коду этого проекта и не заменяет и не изменяет лицензии каких-либо вышестоящих проектов.

Текущие ограничения

  • Windows прошёл основные проверки на реальном оборудовании; Fedora 43 + niri подтверждён как работающий, другие окружения рабочего стола Linux ещё не проверены по отдельности.

  • Lexue по-прежнему требует однократной ручной вставки экспортированного частного адреса подписки на календарь.

  • Срок действия сессии университета определяется вышестоящим шлюзом и не может гарантировать долгосрочный вход без повторной аутентификации.

  • Средний и максимальный баллы зависят от того, предоставляет ли вышестоящая система детали по каждому курсу.

  • Пакет PyPI и отдельный исполняемый файл для Windows пока не опубликованы.

  • Никаких операций записи не предоставляется.

Лицензия

Данный проект использует MIT License. Приветствуется использование, изменение, распространение и отправка улучшений при условии сохранения уведомлений об авторских правах и лицензии.

Вклад

Приветствуются Issue и Pull Request. При сообщении о проблеме, пожалуйста, укажите:

  • Версии операционной системы, Python, uv и MCP-клиента

  • Используемые названия инструментов и обезличенные коды ошибок

  • Появляется ли локальная страница аутентификации

  • Шаги для воспроизведения

Пожалуйста, не отправляйте номера студенческих билетов, пароли, коды подтверждения, Cookie, токены, полные заголовки запросов, URL 乐学 или другую личную информацию.

Available Tools

10 tools
get_course_reviewsGet BIT101 course reviewsB
Read-only

Aggregate course metadata, teachers, reviews, and historical score data.

NameRequiredDescriptionDefault
course_idYesBIT101 course ID.
comment_pagesNoNumber of review pages to aggregate.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context that this is an aggregating read operation pulling several data categories, but it does not disclose details such as pagination behavior, rate limits, or the reach of 'historical score data'.

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

Conciseness5/5

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

A single compact sentence front-loads the action and lists the key result categories with no filler or redundancy. Every word contributes to understanding what the tool returns.

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

Completeness4/5

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

With read-only annotations, a full output schema, and fully documented parameters, the description is largely sufficient for an agent to invoke the tool correctly. The main gap is the lack of guidance for choosing this tool over sibling tools, though that is more a usage-rule concern than a completeness gap.

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

Parameters3/5

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

Schema description coverage is 100%, so both course_id and comment_pages are already well documented with types, defaults, and bounds. The description adds no additional parameter-specific meaning, so it meets the baseline without exceeding it.

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

Purpose4/5

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

The description uses a specific verb ('aggregate') and enumerates the returned resources ('course metadata, teachers, reviews, and historical score data'), making the tool's focus clear. It does not explicitly contrast with siblings like search_courses or get_scores, but the resource description is sufficiently unambiguous.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus sibling tools such as search_courses, get_post, or get_scores. The description only states what it aggregates, leaving the agent to infer appropriate usage from the tool name and title.

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

get_postGet a BIT101 postA
Read-only

Return one BIT101 post by ID.

NameRequiredDescriptionDefault
post_idYesBIT101 post ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already mark the tool as readOnlyHint=true, covering the safety profile. The description adds minimal behavioral detail beyond this, but for a simple single-ID read operation, the core behavior is adequately conveyed. No hidden side effects or contradictions are present.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler. It communicates the action, the resource, and the selection criterion efficiently.

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

Completeness5/5

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

For a simple get-by-ID tool, the description, input schema, output schema, and annotations provide everything an agent needs to invoke it correctly. No additional context about return values or safety is necessary.

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

Parameters3/5

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

The schema fully documents post_id with its own description, so schema coverage is 100%. The description adds no additional parameter semantics beyond what the schema already provides, fitting the baseline of 3.

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

Purpose5/5

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

The description uses a specific verb ('Return') and a specific resource ('one BIT101 post') with a precise selection mechanism ('by ID'). This clearly distinguishes it from sibling list/search tools and leaves no ambiguity about scope.

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

Usage Guidelines3/5

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

The description implies the proper usage: call this tool when you have a specific post_id and need exactly one post. However, it does not explicitly state when to use this tool instead of list_today_posts or search_posts, nor does it mention alternatives.

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

get_scheduleGet BIT scheduleA
Read-only

Whole term only; for relative weeks use get_week_schedule; browser: do not retry.

NameRequiredDescriptionDefault
termNoOptional term code such as 2025-2026-1.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, covering safety and world-openness. The description adds the non-obvious behavioral constraint 'Whole term only' and the retry guidance, which go beyond the structured metadata. No contradiction with annotations exists.

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

Conciseness5/5

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

The description is three short clauses, each carrying distinct functional or operational information. It is front-loaded with the core scope ('Whole term only') and has no filler or redundancy.

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

Completeness5/5

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

Given the single optional parameter, full schema coverage, an output schema, and annotations covering safety, the description provides the remaining necessary context: scope, sibling routing, and a retry caveat. Nothing essential is missing for correct tool selection and invocation.

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

Parameters3/5

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

The input schema fully describes the single optional 'term' parameter, including its format, default, and example. The description does not add parameter-level detail, but with 100% schema coverage the baseline of 3 is appropriate.

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

Purpose4/5

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

The title 'Get BIT schedule' and description 'Whole term only' make it clear the tool retrieves a schedule for a full term, distinguishing it from week-based schedule tools. It lacks an explicit verb in the description, but the name and title supply the action and resource.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool ('Whole term only') and directs users to a specific alternative ('for relative weeks use get_week_schedule'). It also adds the operational warning 'browser: do not retry', which is useful guidance for invocation.

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

get_scoresGet BIT gradesA
Read-only

Return grades with class average/maximum when available; browser: do not retry.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, covering the safety profile. The description adds useful context with 'when available' and the operational note 'browser: do not retry,' but the browser note is terse and does not explain failure or retry semantics in detail.

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

Conciseness5/5

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

The description is a single front-loaded sentence that states the core behavior first. The 'browser: do not retry' clause is terse but adds an operational constraint without unnecessary words.

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

Completeness4/5

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

For a no-parameter, read-only tool with an output schema, the description is nearly complete: it states what is returned and that class average/maximum may not always be present. The ambiguous 'browser: do not retry' note prevents a perfect completeness score.

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

Parameters4/5

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

The input schema has zero parameters and schema description coverage is 100%, so there is no parameter information the description needs to add. The baseline of 4 applies.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Return grades' with an added detail about class average/maximum. This clearly identifies the tool's purpose and distinguishes it from the schedule, course, and post-related sibling tools.

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

Usage Guidelines2/5

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

There is no explicit guidance about when to use this tool versus alternatives, and no prerequisites or exclusions are stated. The name implies the use case, but the description does not actively help an agent decide between tool options.

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

get_today_scheduleGet today's BIT scheduleA
Read-only

Return today's classes. May open a browser for school login; wait, do not retry.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

The description adds a concrete behavioral warning beyond the annotations: it may open a browser for school login, and the agent should wait and not retry. This is valuable context that readOnlyHint/openWorldHint do not fully convey. The instruction 'wait, do not retry' is slightly ambiguous, preventing a 5.

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

Conciseness5/5

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

The description is two short sentences with no filler. The core purpose is front-loaded, and the critical runtime warning follows immediately. Every word earns its place.

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

Completeness5/5

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

Given there are no parameters, an output schema exists, and annotations already cover read-only and open-world behavior, the description is complete for selecting and invoking the tool. The only behavioral nuance an agent needs—possible browser opening and no retry—is explicitly stated.

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

Parameters4/5

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

The tool has zero parameters and the schema covers 100% of them, so there are no parameter semantics the description needs to explain. The baseline of 4 for a zero-parameter tool is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Return') and a precise resource ('today's classes'), making the tool's scope immediately clear. It also naturally distinguishes this tool from siblings like get_week_schedule and get_schedule by anchoring on 'today's'.

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

Usage Guidelines3/5

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

The description implies this tool is for retrieving today's classes, but it never explicitly states when to use it versus alternatives such as get_week_schedule or get_schedule. The browser/login warning is behavioral guidance, not usage selection guidance.

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

get_upcoming_lexue_tasksGet upcoming Lexue tasksA
Read-only

Return Lexue events; invalid subscriptions reopen browser setup; do not retry.

NameRequiredDescriptionDefault
daysNoFuture time window in days.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

With readOnlyHint and openWorldHint annotations already present, the description still adds value by warning that invalid subscriptions can reopen browser setup and instructing not to retry. This exposes an important side effect beyond the standard annotations.

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

Conciseness5/5

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

The description is one compact, front-loaded sentence: purpose first, then the critical retry warning. Every phrase earns its place with no filler.

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

Completeness4/5

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

For a single-parameter read-mostly tool with an output schema, the description covers the core action and the critical failure behavior. It could be more complete by explicitly saying the result is a list of upcoming Lexue tasks, but the name, title, and days parameter fill that gap.

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

Parameters3/5

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

The schema already documents the only parameter, days, with a clear description ('Future time window in days'), so schema description coverage is 100%. The prose description adds no parameter-level detail, matching the baseline of 3.

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

Purpose4/5

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

The description states a concrete action ('Return Lexue events') and the tool name/title specify 'upcoming Lexue tasks', which separates it from the post/course/schedule siblings. It is slightly vague because the description says 'events' rather than 'tasks' and does not explicitly mention the upcoming time window beyond the days parameter.

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

Usage Guidelines2/5

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

The description gives no when-to-use guidance or comparison with sibling tools like get_today_schedule or list_today_posts. The only usage-related note is 'do not retry', which is a retry prohibition rather than guidance for selecting this tool.

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

get_week_scheduleGet this or a relative week's BIT scheduleA
Read-only

Call for this/next/last week. Exact dates/times; browser may open; do not retry.

NameRequiredDescriptionDefault
week_offsetNoWeek relative to current: 0=this, 1=next, -1=last.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond annotations: 'browser may open' and 'do not retry'. Nothing contradicts the annotations.

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

Conciseness5/5

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

Two short sentences carry purpose, output character, a side-effect warning, and a retry instruction with no filler. The most important routing information is front-loaded.

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

Completeness5/5

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

For a single optional parameter, an output schema, and read-only/open-world annotations, the description covers what to call, what kind of output to expect, and the notable side effect. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so week_offset is fully documented with its default, range, and meaning. The description only paraphrases this/next/last week and adds no parameter-specific details, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description clearly identifies the resource (a relative week's BIT schedule) and the action (get/call for this/next/last week), so an agent can tell what the tool does. It does not explicitly contrast with siblings like get_today_schedule or get_schedule, so it stops short of full differentiation.

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

Usage Guidelines4/5

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

'Call for this/next/last week' provides a clear target use case, and 'do not retry' gives explicit invocation guidance. It lacks exclusions or named alternatives, such as pointing to get_today_schedule for today-only schedules, so it is not a 5.

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

list_today_postsList today's BIT101 postsA
Read-only

Return BIT101 posts created today in Asia/Shanghai time.

NameRequiredDescriptionDefault
limitNoMaximum posts to return.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this by saying 'Return'. It adds valuable context about the Asia/Shanghai timezone determining the day boundary. No contradictory or misleading behavior is stated, and the description does not claim anything beyond what the tool does.

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

Conciseness5/5

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

The description is a single clear sentence that front-loads the purpose, resource, and timezone. Every word is necessary and there is no extraneous information.

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

Completeness5/5

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

For a simple read-only list operation with zero required parameters and an output schema present, the description fully covers the essential contextual detail: the resource, the time scope, and the timezone boundary. Nothing critical for invoking this tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the only parameter 'limit' is fully documented in the schema as 'Maximum posts to return' with defaults and bounds. The description does not add additional parameter behavior beyond what the schema already provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Return'), a clear resource ('BIT101 posts'), and an unambiguous scope ('created today in Asia/Shanghai time'). It distinguishes itself from siblings like search_posts and get_post by focusing on today's posts. The addition of the timezone disambiguates the meaning of 'today'.

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

Usage Guidelines4/5

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

The description clearly communicates that this tool returns today's BIT101 posts, implying it is the choice when the agent needs a list of posts from the current day in Asia/Shanghai time. It does not explicitly name alternatives or exclusion conditions, but the context is clear enough relative to siblings such as search_posts and get_post.

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

search_coursesSearch BIT101 coursesB
Read-only

Search BIT101 course and teacher records.

NameRequiredDescriptionDefault
pageNoZero-based result page.
limitNoMaximum courses to return.
orderNorate
queryYesCourse or teacher search text.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description is not burdened with explaining safety behavior. It adds some scope context (courses and teacher records) but does not disclose additional behavioral traits such as matching behavior or ordering semantics.

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

Conciseness5/5

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

The description is a single efficient sentence with no filler. It is front-loaded with the verb and target resource and earns its place.

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

Completeness4/5

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

Given the output schema, annotations, and parameter descriptions, the definition is largely complete for a search operation. The only notable gap is the absence of any usage guidance relative to sibling tools, but this does not prevent an agent from invoking the tool correctly.

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

Parameters3/5

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

Schema description coverage is 75%: query, page, and limit have descriptions, and order has an enum. The description adds little beyond what the schema already says, though it does reinforce that queries can target both course and teacher records.

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

Purpose4/5

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

The description states a clear verb and resource: 'Search BIT101 course and teacher records.' This identifies the tool's scope and distinguishes it from siblings like search_posts, though it does not explicitly contrast itself with those alternatives.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as search_posts or get_course_reviews. The resource scope is implied by the description, but no when-to-use or when-not-to-use context is provided.

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

search_postsSearch BIT101 postsA
Read-only

Search public BIT101 discussion posts.

NameRequiredDescriptionDefault
pageNoZero-based result page.
limitNoMaximum posts to return.
queryYesSearch text.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, covering the operation's safety and dynamic nature. The description adds the 'public' scope and 'discussion posts' resource, which is useful context, but does not disclose additional behavioral details such as pagination behavior, result ordering, or real-time semantics beyond what annotations and schema already provide.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no wasted words. It conveys the essential purpose immediately and does not repeat information already available in the schema or annotations.

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

Completeness5/5

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

For a simple search tool with three well-documented parameters, readOnly/openWorld annotations, and an output schema, the description is sufficient. An agent can correctly understand the tool's purpose and invoke it without needing additional context.

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

Parameters3/5

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

The input schema provides complete descriptions for all three parameters (query, page, limit), so the description does not need to compensate. The description itself adds no parameter-level meaning, but with 100% schema coverage the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the specific verb 'Search' and the resource 'public BIT101 discussion posts,' making the tool's purpose immediately evident. It distinguishes itself from sibling tools like list_today_posts and get_post by emphasizing search over listing or retrieval.

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

Usage Guidelines3/5

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

The description implies this tool is for searching public posts by keyword, but it does not explicitly state when to use it instead of alternatives like list_today_posts or get_post. There is no exclusionary guidance or mention of alternatives, so the agent must infer usage from the name and description.

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

Tool Schema Changelog

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

  1. 10 tool updatesv0.1.0
    • First observedget_course_reviews
    • First observedget_post
    • First observedget_schedule
    • First observedget_scores
    • First observedget_today_schedule
    • First observedget_upcoming_lexue_tasks
    • First observedget_week_schedule
    • First observedlist_today_posts
    • First observedsearch_courses
    • First observedsearch_posts

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

Each tool maps to a distinct resource or time range, and the schedule tools are explicitly qualified as today, week, or whole term. The only mild overlap is between search_courses and get_course_reviews, but the descriptions help differentiate them.

Naming Consistency5/5

Tool names consistently use a verb prefix (get, list, or search) followed by a lowercase snake_case noun phrase, such as get_course_reviews and list_today_posts. There is no mixed casing or inconsistent verb style.

Tool Count5/5

Ten tools cover the main BIT101 areas—posts, courses, schedules, grades, and tasks—without feeling bloated. The additional schedule and post tools each serve a specific retrieval need, so the count is well-scoped.

Completeness4/5

The read-only surface is fairly complete for posts, courses, schedules, scores, and Lexue tasks. Minor gaps exist, such as arbitrary future-date schedule lookup and any write/submit endpoints, but these are likely outside scope and workarounds are available.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides read-only access to Canvas LMS, enabling users to view active courses, grades, and upcoming assignments through natural language queries.
    2
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only queries of i桂航 campus data, including schedules, classes, terms, and campus information through MCP tools.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to read courses, upcoming deadlines, assignment details, grades, announcements, modules, files, inbox, and timetable from U of T Quercus and ACORN through read-only tools.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to read a student's own university academic data — class timetables, exam schedules, grades, available terms, and empty classrooms — from Qiangzhi (jsxsd) or Zhengfang V9 systems via a session imported from the browser. All access is strictly read-only, never performing course selection, withdrawal, or evaluations.
    6
    1
    MIT