bit101-mcp
BIT101 MCP
Un servicio local de solo lectura Model Context Protocol (MCP) para estudiantes de la Universidad de Tecnología de Beijing. Convierte el contenido de la comunidad BIT101, las evaluaciones de cursos, el horario personal, las calificaciones y el calendario Lexue en datos estructurados fáciles de entender para los agentes, de modo que puedas hacer preguntas directamente en lenguaje natural.
[!IMPORTANT] Este proyecto es un proyecto comunitario no oficial y no tiene afiliación con la Universidad de Tecnología de Beijing ni con BIT101 oficial. Windows ha sido probado en hardware real para los flujos principales, y Fedora 43 + niri ha sido verificado como funcional; el proyecto aún se encuentra en fase MVP. Antes de usarlo, lee Autenticación, seguridad y privacidad.
Qué puede hacer
Resumir las publicaciones de BIT101 de hoy, o buscar discusiones históricas por palabras clave
Consultar cursos, profesores y evaluaciones de estudiantes de años anteriores
Obtener el horario de hoy, esta semana, la próxima semana o de un semestre específico
Consultar calificaciones, créditos, promedio de la clase y puntuación máxima (cuando el proveedor los proporcione)
Consultar eventos del calendario Lexue para un período futuro
Combinar datos de diferentes fuentes para responder preguntas, por ejemplo: "¿Cómo evalúa la gente a los profesores de mis cursos del próximo semestre?"
Todas las herramientas son de solo lectura. El proyecto no puede publicar, dar me gusta, comentar, enviar tareas, modificar calificaciones ni alterar ningún dato escolar.
Related MCP server: iGuat-MCP
Demostración en hardware real
Las siguientes capturas de pantalla provienen de llamadas reales desde OpenCode CLI en Windows. Las respuestas específicas son generadas por el modelo utilizado según los datos devueltos por MCP y no representan las opiniones del autor del proyecto, y pueden cambiar según el modelo y las actualizaciones de datos.
Resumen de publicaciones de hoy
El agente llama a list_today_posts para obtener las publicaciones del día y luego genera un breve resumen según el título, el contenido y la interacción.

Evaluaciones de profesores y cursos
El agente primero busca los cursos correspondientes al profesor y luego llama a get_course_reviews para agregar metadatos del curso, puntuaciones, comentarios e información histórica.

Discusión sobre orientación profesional
Cuando la biblioteca de cursos no tiene una coincidencia exacta, el agente puede continuar buscando publicaciones de BIT101 y leer discusiones relevantes, lo que demuestra el uso encadenado de múltiples herramientas MCP.

Calendario Lexue
El agente puede consultar eventos de Lexue dentro de 7 a 90 días. Cuando un calendario válido no tiene tareas próximas, devuelve normalmente una lista vacía en lugar de interpretar erróneamente "no hay tareas" como una falla de la interfaz.

Preparación antes del uso
Entorno recomendado actualmente:
Windows 10/11, o Linux con navegador de escritorio y keyring del sistema disponible (Fedora 43 + niri probado)
Python 3.11 o superior
Un cliente compatible con MCP stdio local, como Codex, OpenCode, Cursor o Claude Code
Cuenta de BIT101
Para consultar horarios y calificaciones, también se necesita una cuenta de autenticación unificada de la Universidad de Tecnología de Beijing; algunos inicios de sesión pueden requerir verificación por SMS
Para consultar Lexue, es necesario exportar una vez una dirección de suscripción de calendario privada desde Lexue
Instalación
Dile a tu agente (recomendado)
Si tu agente puede ejecutar comandos de terminal y modificar su propia configuración de MCP, puedes enviarle directamente el siguiente texto:
请帮我安装并配置 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. 不要修改默认上游地址。完成后告诉我修改了哪些配置文件以及验证结果。Una vez que el agente complete la instalación, simplemente pregunta en una nueva conversación "resume las publicaciones de BIT101 de hoy" para activar la primera autenticación bajo demanda.
Instalación desde el código fuente
Una vez que el repositorio sea público, puedes ejecutar:
git clone https://github.com/tiny-paris/BIT101-mcp.git
cd BIT101-mcp
uv sync --all-groups
uv tool install .uv tool install . instalará bit101-mcp como un comando a nivel de usuario. Puedes ver el directorio de ejecutables de uv con el siguiente comando:
uv tool dir --binSi el cliente MCP no encuentra bit101-mcp, reinicia el cliente, o usa la ruta absoluta de bit101-mcp.exe en ese directorio en la configuración.
Ejecutar solo dentro del directorio del código fuente
Para desarrollo o pruebas, también puedes ejecutar sin instalar el comando:
uv sync --all-groups
uv run bit101-mcpDespués de iniciarse normalmente, el MCP stdio espera silenciosamente mensajes de protocolo; que parezca "congelado" es normal. No lo uses como un comando interactivo normal ni introduzcas nombre de usuario o contraseña en su terminal.
[!NOTE] El soporte simple de
uvx bit101-mcpsolo estará disponible después de que el proyecto se publique en PyPI. El README actual no asume que el paquete de PyPI ya exista.
Notas sobre dependencias
El proyecto declara 7 dependencias directas en tiempo de ejecución. No todas son "requisitos obligatorios del protocolo MCP", sino que son los componentes que cada funcionalidad completa necesita actualmente:
Dependencia | Uso en el proyecto | ¿Se puede eliminar actualmente? |
| Servidor MCP stdio, registro de herramientas, contexto y tipos de protocolo | No; es la dependencia principal |
| Cliente HTTPS asíncrono/síncrono para acceder a BIT101, BIT-Login y el calendario Lexue | No; todos los datos y la autenticación requieren red |
| Guarda sesiones y la dirección de suscripción de Lexue en el almacén de credenciales del sistema operativo | No; sin ella no se pueden reutilizar sesiones de forma segura entre procesos |
| Valida y analiza el ICS/iCalendar exportado de Lexue | No; la funcionalidad de Lexue y la importación al inicio la usan |
| Expande las reglas de recurrencia (RRULE) en el calendario Lexue | No; los eventos periódicos la necesitan |
| Rangos de parámetros de herramientas MCP y esquema JSON, como cantidad de publicaciones, desplazamiento de semanas, días de consulta | No; el código fuente la usa directamente y el SDK de MCP también se basa en ella |
| Proporciona la base de datos de zona horaria | No recomendado eliminar; de lo contrario, algunos entornos Windows/Python no pueden calcular correctamente "hoy" y la semana lectiva |
Por lo tanto, para la versión actual de paquete único, estas 7 son dependencias de ejecución; pero desde el punto de vista funcional, icalendar y python-dateutil solo sirven a Lexue. Si en el futuro se dividen como funcionalidad opcional, podrían convertirse en dependencias adicionales. Dividirlas ahora aumentaría la complejidad de instalación y de informes de errores, y el espacio ahorrado sería muy limitado.
En uv.lock también verás dependencias indirectas como anyio, httpcore, certifi, etc. Son traídas automáticamente por las bibliotecas anteriores, no son componentes de nivel superior invocados directamente por el proyecto, y no deben instalarse ni eliminarse manualmente por separado.
Las siguientes dependencias solo se usan para desarrollo y publicación, y no se instalan como dependencias de ejecución normales:
Dependencia | Uso |
| Pruebas automatizadas |
| Revisión y formato de código |
| Construcción de paquetes fuente y wheel |
Configurar el cliente MCP
La primera autenticación escolar puede tardar varios minutos, por lo que se recomienda establecer el tiempo de espera de una sola llamada de herramienta en 360 segundos. Después de la configuración, es necesario reiniciar el cliente MCP para que inicie un nuevo proceso de servicio.
Codex
Codex CLI, la extensión de Codex para IDE y el host de Codex en el escritorio de ChatGPT comparten la configuración de MCP en config.toml. La documentación oficial está en Documentación de MCP de Codex.
Primero agrégalo a través de la CLI:
codex mcp add bit101 -- bit101-mcp
codex mcp listLuego revisa el %USERPROFILE%\.codex\config.toml a nivel de usuario y añade el tiempo de espera de herramientas:
[mcp_servers.bit101]
command = "bit101-mcp"
tool_timeout_sec = 360Si solo quieres habilitarlo en un proyecto de confianza, puedes poner la misma configuración en el .codex/config.toml de ese proyecto. La configuración a nivel de usuario se puede usar en cualquier directorio y en nuevas conversaciones.
Si el comando no está en el PATH de Codex, puedes cambiar a la ruta absoluta:
[mcp_servers.bit101]
command = 'C:\path\to\bit101-mcp.exe'
tool_timeout_sec = 360OpenCode
Este proyecto ha sido probado en hardware real en Windows con la siguiente configuración tradicional de OpenCode. Colocarlo en opencode.json en la raíz del proyecto solo afecta a ese proyecto; si deseas usarlo en cualquier directorio, colócalo a nivel de usuario en ~/.config/opencode/opencode.json (en Windows normalmente corresponde a %USERPROFILE%\.config\opencode\opencode.json).
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"bit101": {
"type": "local",
"command": ["bit101-mcp"],
"enabled": true,
"timeout": 360000
}
}
}Verificar la conexión:
opencode mcp listSi solo se puede iniciar en el directorio del código fuente, normalmente es porque la configuración usa un comando relativo y no se instaló globalmente. Instala bit101-mcp, o cambia command a la ruta absoluta de .venv\Scripts\bit101-mcp.exe.
La estructura de configuración de OpenCode V2 es diferente: los servicios están en mcp.servers y el tiempo de espera de ejecución en mcp.timeout.execution. Consulta la documentación oficial de MCP de OpenCode:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"timeout": {
"execution": 360000
},
"servers": {
"bit101": {
"type": "local",
"command": ["bit101-mcp"]
}
}
}
}Cursor
Según la documentación de MCP de Cursor, la configuración global va en ~/.cursor/mcp.json y la configuración del proyecto en .cursor/mcp.json:
{
"mcpServers": {
"bit101": {
"command": "bit101-mcp",
"args": []
}
}
}Después de guardar, reinicia Cursor y confirma que bit101 está habilitado en la lista de herramientas disponibles del agente.
Claude Code
Según la documentación de MCP de Claude Code, agrega un servicio stdio a nivel de usuario:
claude mcp add --scope user bit101 -- bit101-mcp
claude mcp listConfiguración stdio genérica
Otros clientes MCP solo necesitan configurar un proceso stdio local:
{
"command": "bit101-mcp",
"args": []
}No escribas nombre de usuario, contraseña, cookies, tokens ni URL de Lexue en la configuración de MCP, variables de entorno o parámetros de herramientas.
Comenzar a usar
Después de la configuración, simplemente pregunta directamente en la conversación del agente; no es necesario iniciar servicios en segundo plano manualmente. Por ejemplo:
Comunidad y cursos de BIT101
总结一下今天 BIT101 都有哪些帖子。
查找最近关于“数据结构”的讨论。
如何评价某某老师的某门课?请区分普遍评价和少数意见。
查找“特立自动化”相关讨论,并列出信息来源。Horarios y calificaciones
我今天有什么课?
我下周有什么课?按实际日期和开始时间排序。
列出本学期完整课表。
列出我的所有成绩,包括课程、学期、学分、成绩、班级平均分和最高分。Al preguntar por "esta semana/próxima semana", el servidor calcula la semana exacta según la fecha actual y devuelve tiempos completos como starts_at, ends_at; el agente no necesita adivinar la semana lectiva ni los horarios de las clases.
Lexue
未来 14 天有哪些乐学任务?按截止时间排序。
看看未来 30 天的乐学日历。Herramientas disponibles
Herramienta | Función | Autenticación requerida |
| Obtiene las publicaciones de BIT101 del día en la zona horaria de Shanghái | BIT101 |
| Busca publicaciones de BIT101 | BIT101 |
| Lee una publicación específica e información relacionada | BIT101 |
| Busca cursos y profesores | BIT101 |
| Agrega información de cursos, profesores, comentarios y cursos históricos | BIT101 |
| Obtiene las clases de hoy | Autenticación unificada escolar |
| Obtiene el horario con fechas de esta semana, la próxima o semanas relativas | Autenticación unificada escolar |
| Obtiene el horario completo del semestre actual o de un semestre específico | Autenticación unificada escolar |
| Obtiene calificaciones y estadísticas de clase disponibles | Autenticación unificada escolar |
| Analiza eventos del calendario Lexue de los próximos 1 a 90 días | Autenticación escolar + dirección de suscripción de Lexue |
Los resultados exitosos tienen un formato uniforme:
{
"ok": true,
"data": {}
}Los resultados fallidos no incluyen trazas de pila del proveedor ni información de autenticación:
{
"ok": false,
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"service": "bit101",
"message": "BIT101 is temporarily unavailable.",
"retryable": true
}
}Principios técnicos
El núcleo se divide en cuatro capas:
Capa de herramientas MCP: solo expone conceptos de usuario como publicaciones, cursos, horarios, calificaciones y tareas; no expone cookies, tokens de desafío ni identificadores de servicios internos.
Capa de clientes: maneja por separado la API de BIT101 y la pasarela de datos escolares; cuando una solicitud falla, determina si la sesión ha expirado y realiza solo un reintento recuperable.
Capa de estandarización: convierte los diferentes formatos de los proveedores en campos estables y compatibles con JSON; se encarga del análisis de fechas en la zona horaria de Shanghái, semanas lectivas, horarios de clases, calificaciones y eventos ICS.
Capa de autenticación y almacenamiento: abre una página local solo cuando es necesario; las contraseñas no entran en los parámetros de MCP; después del éxito, solo se guarda la sesión reutilizable.
MCP usa transporte stdio. La salida estándar solo envía datos del protocolo MCP; los registros de ejecución solo se escriben en el error estándar, evitando que los registros corrompan la comunicación del protocolo.
Flujo de autenticación
¿Por qué no se puede reutilizar directamente el inicio de sesión de BIT101 en el navegador?
Las cookies del navegador pertenecen al espacio de seguridad del propio navegador; MCP es un proceso local independiente. El proyecto deliberadamente no lee la base de datos de cookies de Chrome/Edge ni requiere la instalación de extensiones de navegador. Esto implica una autenticación inicial adicional, pero evita que MCP escanee todas las credenciales del navegador del usuario.
Abrir una nueva conversación de agente no borra el estado de inicio de sesión. Al iniciarse, MCP lee y verifica las sesiones guardadas; solo se vuelve a iniciar sesión si la sesión no existe, el proveedor la considera inválida, el desafío temporal de la pasarela de autenticación ha expirado, o el almacén de credenciales del sistema no está disponible.
BIT101
En la primera llamada a una herramienta de la comunidad:
MCP inicia una página temporal en un puerto aleatorio de
127.0.0.1.El usuario introduce su número de estudiante y la contraseña de BIT101 en la página local.
El proceso local procesa la contraseña según el protocolo de inicio de sesión existente de BIT101 y solicita la API de BIT101 mediante HTTPS.
Después de un inicio de sesión exitoso, solo se guarda la sesión de BIT101 devuelta en el administrador de credenciales del sistema; la contraseña original no se persiste.
La página temporal se cierra y la llamada de herramienta original continúa ejecutándose.
Horarios y calificaciones escolares
Los horarios y calificaciones provienen de la capacidad de datos personales de la escuela y no son la misma "llave" que la sesión de la comunidad BIT101. En la primera llamada, la página local recopila la cuenta de autenticación unificada, la contraseña y, si es necesario, el código de verificación por SMS, y los envía mediante HTTPS a la pasarela REST de BIT-Login existente. MCP guarda la sesión de desafío a corto plazo devuelta por la pasarela, no la contraseña escolar.
Calendario Lexue
La pasarela REST de BIT-Login actual no proporciona una interfaz de calendario Lexue que este proyecto pueda invocar, y el proyecto no reimplementa el CAS/SSO escolar. Por lo tanto, el MVP requiere que el usuario genere una dirección de suscripción privada en la página Calendario → Exportar calendario de Lexue y la pegue una vez en la página de conexión local.
La página de conexión descarga y verifica realmente el contenido iCalendar; solo una suscripción válida muestra Connected; las páginas normales de calendar/view.php son rechazadas. La dirección de suscripción no entra en los resultados del agente ni de las herramientas MCP, y se guarda en el administrador de credenciales del sistema. Un calendario válido sin eventos próximos devuelve una lista vacía.
Autenticación, seguridad y privacidad
Conclusión primero
Este proyecto reduce el riesgo de que las contraseñas entren en el agente, el historial de chat y los registros, pero no puede prometer "riesgo cero". Instalar un MCP local equivale a instalar un programa local con acceso a red; el usuario debe confiar en el código fuente del proyecto, los paquetes de instalación, las dependencias y los servicios de autenticación remotos configurados.
Especialmente hay que distinguir dos afirmaciones:
Las contraseñas no se envían al agente/LLM: es un límite implementado explícitamente por este proyecto.
Las contraseñas solo existen en esta máquina: no es así. La contraseña de autenticación unificada escolar debe ser enviada por el MCP local mediante HTTPS a la pasarela BIT-Login remota configurada para completar la autenticación.
¿Qué información va a dónde?
Información | Quién la toca | ¿Se persiste? |
Contraseña de BIT101 | Código de autenticación local; se envía a la API de BIT101 después de procesarse según el protocolo del proveedor | No se guarda la contraseña |
Contraseña de autenticación unificada escolar | Código de autenticación local y la pasarela BIT-Login configurada | No se guarda |
Código de verificación por SMS | Código de autenticación local y la pasarela BIT-Login | No se guarda |
Sesión de BIT101/escolar | MCP local y el proveedor correspondiente | Almacén de credenciales del sistema operativo |
Dirección de suscripción privada de Lexue | MCP local y el servicio de calendario de | Almacén de credenciales del sistema operativo |
Publicaciones, cursos, horarios, calificaciones, eventos de Lexue | MCP y el agente actual | Entra en el contexto del agente actual |
Las direcciones de proveedores por defecto son:
API de BIT101:
https://bit101.flwfdd.xyzREST de BIT-Login:
https://login.bit101.flwfdd.xyz
HTTPS puede prevenir la interceptación general en la red, pero no sustituye la confianza en el operador del servidor. Los usuarios que no se sientan cómodos con que la contraseña escolar pase por una pasarela remota no deberían habilitar las herramientas de horarios y calificaciones.
Protecciones implementadas
El servicio HTTP temporal solo se vincula a
127.0.0.1, usando un puerto aleatorio asignado por el sistema operativo.Cada autenticación usa un state aleatorio de 256 bits y se compara en tiempo constante para resistir envíos falsificados.
La página desactiva caché, contenido externo, iframes, referrer y adivinación de MIME.
La página deja de escuchar después de éxito, cancelación o tiempo de espera.
Las contraseñas y códigos de verificación no se escriben en archivos; el código limpia las referencias a las variables relevantes lo antes posible después de la solicitud.
Las sesiones se escriben mediante el
keyringde Python en el almacén de credenciales del sistema operativo (Administrador de credenciales de Windows, o el backend de Secret Service/keyring en Linux); si no está disponible, solo se guardan en memoria del proceso actual, sin recurrir a archivos en texto plano.Los registros enmascaran contraseñas, códigos de verificación, cookies, tokens Bearer y cabeceras Authorization.
La dirección de Lexue debe usar HTTPS bajo el dominio
bit.edu.cny debe devolver un iCalendar válido.Todas las herramientas están marcadas como de solo lectura; no proporcionan capacidad de modificar datos escolares o de la comunidad.
Lo que el usuario debe tener en cuenta
Instala solo desde repositorios o páginas de publicación de confianza, y verifica el código fuente y los hashes de publicación siempre que sea posible.
La dirección de la página de autenticación local debe comenzar con
http://127.0.0.1:<puerto aleatorio>/connect.Nunca envíes contraseñas, códigos de verificación, cookies, tokens ni URL de Lexue en el cuadro de chat del agente, parámetros de MCP, issues o registros.
No uses cuentas escolares personales en computadoras públicas no confiables.
La URL de suscripción de Lexue es un enlace privado "quien lo tiene puede leerlo"; protégela como una contraseña; si sospechas que se ha filtrado, regenérala en Lexue.
Al consultar calificaciones y horarios, los datos correspondientes se proporcionan al agente actual. Decide si habilitarlo según la política de datos del modelo y cliente que uses.
Limpiar sesiones locales
En Windows, abre Panel de control → Administrador de credenciales → Credenciales de Windows; en Linux, abre la herramienta de gestión de Secret Service del entorno de escritorio actual (comúnmente GNOME Keyring o KDE Wallet). Elimina las siguientes entradas con el nombre de servicio bit101-mcp:
bit101-sessionschool-sessionlexue-calendar-url
Después de eliminarlas, la siguiente llamada a la herramienta correspondiente volverá a autenticarse. Desinstalar el paquete de Python no elimina automáticamente estas credenciales del sistema. Si Linux no tiene un backend de keyring disponible, las sesiones solo se guardan en la memoria del proceso actual y será necesario volver a iniciar sesión al reiniciar MCP.
Opciones de configuración
Solo se permiten parámetros no secretos mediante variables de entorno:
Variable | Valor por defecto | Uso |
|
| Dirección raíz de la API de BIT101 |
|
| Dirección raíz de REST de BIT-Login |
|
| Tiempo de espera de una sola solicitud HTTP al proveedor, en segundos |
|
| Tiempo máximo de espera de la página de autenticación local, en segundos |
Las credenciales y sesiones no se pueden configurar mediante parámetros de herramientas ni variables de entorno. Modificar las direcciones de los proveedores implica confiar en nuevos operadores de servicios; úsalo con precaución.
Preguntas frecuentes
¿Es obligatorio iniciar el agente en el directorio del proyecto?
No. Después de instalar el comando con uv tool install . y escribir el MCP en la configuración a nivel de usuario del cliente, se puede usar desde cualquier directorio. El opencode.json, .cursor/mcp.json o .codex/config.toml en la raíz del proyecto solo afectan al proyecto correspondiente.
¿Por qué se abre el navegador la primera vez?
La autenticación se activa bajo demanda. La primera consulta de publicaciones requiere la sesión de BIT101; la primera consulta de horarios/calificaciones requiere la sesión escolar; la primera consulta de Lexue también requiere la suscripción de calendario privada. Las contraseñas y la dirección de suscripción no pueden pasar por el chat, por lo que se usa una página local temporal para recopilarlas.
¿Por qué MCP sigue pidiendo iniciar sesión si ya estoy conectado en la página web de BIT101?
La sesión web se guarda en las cookies del navegador. MCP no lee las cookies del navegador, por lo que necesita establecer su propia sesión mínima. Esto sacrifica la conveniencia del primer inicio de sesión, pero evita acceder directamente a todos los datos de inicio de sesión del navegador.
¿Por qué a veces hay que volver a iniciar sesión en una conversación nueva?
Una conversación nueva no borra activamente la sesión, pero MCP verifica la sesión del proveedor. Se vuelve a iniciar sesión cuando la sesión expira, el servidor la revoca, el desafío de la pasarela de autenticación caduca, o el almacén de credenciales del sistema no está disponible. Si acabas de iniciar sesión con éxito y al reiniciar inmediatamente vuelve a pedirla, verifica si existen entradas de bit101-mcp en el almacén de credenciales del sistema.
Lexue muestra Connected, ¿por qué no hay tareas?
Si la dirección de suscripción pasó la verificación iCalendar, una lista vacía normalmente significa que realmente no hay eventos en el rango de tiempo seleccionado. Puedes ampliar el rango de consulta de 7 días a 30 días para confirmarlo.
¿Por qué las herramientas escolares parecen lentas?
La primera autenticación escolar, la verificación por SMS y la obtención de detalles de calificaciones pueden tardar bastante. Establece el tiempo de espera de las herramientas MCP en 360 segundos y espera a que la llamada actual termine; no reintentes varias herramientas escolares simultáneamente.
¿Qué hago si no se encuentra el comando bit101-mcp?
Ejecuta uv tool dir --bin para encontrar el directorio de instalación, añádelo al PATH, o escribe directamente la ruta absoluta de bit101-mcp.exe en la configuración de MCP. Después de modificar, reinicia el cliente.
Códigos de error
Código | Significado |
| Es necesario establecer una sesión de BIT101 |
| Es necesario establecer una sesión escolar |
| La sesión guardada ha expirado |
| El inicio de sesión no tuvo éxito o las credenciales no fueron aceptadas por el proveedor |
| Tiempo de espera de la página de autenticación local agotado |
| La suscripción de Lexue no existe, está caducada o no es un calendario válido |
| El registro especificado (como una publicación) no existe |
| El servicio del proveedor está temporalmente no disponible; se puede reintentar más tarde |
| El proveedor devolvió datos no reconocibles |
Todos los errores se limpian; no se devuelven contraseñas, cookies, tokens, cabeceras Authorization, trazas de pila originales ni solicitudes sensibles completas.
Desarrollo
Estructura del proyecto:
src/bit101_mcp/
├── server.py # MCP 入口、工具注册和服务器说明
├── tools/ # Agent 可见的只读工具
├── clients/ # BIT101 与学校上游客户端
├── auth/ # 本地浏览器认证、状态机和凭据存储
├── models/ # 数据标准化、周次和 ICS 解析
└── logging_utils.py # stderr 日志和秘密脱敏Instalar dependencias de desarrollo y ejecutar verificaciones:
uv sync --all-groups
uv run ruff check .
uv run ruff format --check .
uv buildAntes de publicar, los mantenedores usan pruebas simuladas que no se distribuyen con el repositorio público para verificar la estandarización de datos, el estado de autenticación, el enmascaramiento de secretos y el flujo de reintentos; estas pruebas no requieren cuentas reales. Las pruebas de integración con cuentas reales se mantienen manuales y opcionales; no se deben enviar credenciales de prueba al repositorio ni a CI.
Agradecimientos
Gracias al proyecto BIT101 y a todos sus contribuyentes. La comunidad, las evaluaciones de cursos, las interfaces de datos del campus y las herramientas de autenticación mantenidas durante mucho tiempo por los estudiantes de cursos anteriores han traído gran comodidad a la vida universitaria de los estudiantes y han proporcionado una base importante para este proyecto.
Este proyecto hace referencia o utiliza especialmente las interfaces y documentación de los siguientes proyectos:
BIT101 MCP es un cliente MCP no oficial desarrollado de forma independiente que interactúa con los servicios relacionados a través de interfaces de red. La Licencia MIT de este repositorio solo se aplica al código original de este proyecto y no sustituye ni modifica las licencias de ningún proyecto upstream.
Limitaciones actuales
Windows ha sido probado en hardware real para los flujos principales; Fedora 43 + niri ha sido verificado como funcional; otros entornos de escritorio Linux aún no se han verificado uno por uno.
Lexue aún requiere pegar manualmente una vez la dirección de suscripción de calendario privada exportada.
La validez de la sesión escolar la determina la pasarela del proveedor; no se puede garantizar un inicio de sesión permanente sin reautenticación.
El promedio y la puntuación máxima de las calificaciones dependen de si el proveedor proporciona los detalles de cada curso.
Aún no se han publicado el paquete de PyPI ni el ejecutable independiente para Windows.
No se proporciona ninguna operación de escritura.
Licencia
Este proyecto utiliza la Licencia MIT. Se permite usar, modificar, distribuir y enviar mejoras siempre que se conserven los avisos de copyright y licencia.
Contribuciones
Se aceptan Issues y Pull Requests. Al informar de un problema, proporcione:
Versión del sistema operativo, Python, uv y del cliente MCP
Nombre de la herramienta utilizada y códigos de error anonimizados
Si aparece la página de autenticación local
Pasos para reproducir el problema
No envíe números de identificación de estudiante, contraseñas, códigos de verificación, cookies, tokens, cabeceras de solicitud completas, URL de 乐学 ni otra información personal.
Available Tools
10 toolsget_course_reviewsGet BIT101 course reviewsBRead-only
Aggregate course metadata, teachers, reviews, and historical score data.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | BIT101 course ID. | |
| comment_pages | No | Number of review pages to aggregate. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 postARead-only
Return one BIT101 post by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | BIT101 post ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 scheduleARead-only
Whole term only; for relative weeks use get_week_schedule; browser: do not retry.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Optional term code such as 2025-2026-1. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 gradesARead-only
Return grades with class average/maximum when available; browser: do not retry.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 scheduleARead-only
Return today's classes. May open a browser for school login; wait, do not retry.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 tasksARead-only
Return Lexue events; invalid subscriptions reopen browser setup; do not retry.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Future time window in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 scheduleARead-only
Call for this/next/last week. Exact dates/times; browser may open; do not retry.
| Name | Required | Description | Default |
|---|---|---|---|
| week_offset | No | Week relative to current: 0=this, 1=next, -1=last. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 postsARead-only
Return BIT101 posts created today in Asia/Shanghai time.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum posts to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 coursesBRead-only
Search BIT101 course and teacher records.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Zero-based result page. | |
| limit | No | Maximum courses to return. | |
| order | No | rate | |
| query | Yes | Course or teacher search text. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 postsARead-only
Search public BIT101 discussion posts.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Zero-based result page. | |
| limit | No | Maximum posts to return. | |
| query | Yes | Search text. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.1.0- First observed
get_course_reviews - First observed
get_post - First observed
get_schedule - First observed
get_scores - First observed
get_today_schedule - First observed
get_upcoming_lexue_tasks - First observed
get_week_schedule - First observed
list_today_posts - First observed
search_courses - First observed
search_posts
TDQS
Scored across 10 tools
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.
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.
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.
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
Related MCP Connectors
Search university course materials, your flashcards, quizzes, streak and quota. All tools read-only.
- PithflowOAuthcom.pithflow
Read-only access to your own Pithflow meeting notes, transcripts, dictionary and usage.
Read-only access to your dotstell notes, bookmarks, tasks, people and meetings.
Read-only University of Macau course, instructor and review data.
Related MCP Servers
- AlicenseAqualityCmaintenanceProvides read-only access to Canvas LMS, enabling users to view active courses, grades, and upcoming assignments through natural language queries.2MIT
- FlicenseNot gradedqualityCmaintenanceEnables read-only queries of i桂航 campus data, including schedules, classes, terms, and campus information through MCP tools.-
- AlicenseNot gradedqualityAmaintenanceEnables 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.1MIT
- AlicenseAqualityAmaintenanceEnables 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.61MIT