bit101-mcp
BIT101 MCP
Ein lokaler, schreibgeschützter Model Context Protocol (MCP)-Dienst für Studierende der Beijing Institute of Technology. Er wandelt BIT101-Community-Inhalte, Kursbewertungen, persönliche Stundenpläne, Noten und Lexue-Kalender in für Agenten leicht verständliche strukturierte Daten um, sodass du direkt in natürlicher Sprache Fragen stellen kannst.
[!IMPORTANT] Dieses Projekt ist ein inoffizielles Community-Projekt und steht in keiner Verbindung zur Beijing Institute of Technology oder zum offiziellen BIT101. Windows wurde mit den wichtigsten Abläufen auf echter Hardware getestet, Fedora 43 + niri wurde als lauffähig verifiziert; das Projekt befindet sich noch in der MVP-Phase. Bitte lies vor der Verwendung Authentifizierung, Sicherheit und Datenschutz.
Funktionen
Zusammenfassen der heutigen BIT101-Beiträge oder Suche nach historischen Diskussionen per Stichwort
Abfragen von Kursen, Dozenten und Bewertungen aus vergangenen Jahren
Abrufen des Stundenplans für heute, diese Woche, nächste Woche oder ein bestimmtes Semester
Abfragen von Noten, Leistungspunkten, Klassen-Durchschnitt und Bestnoten (sofern vom Upstream bereitgestellt)
Abfragen von Lexue-Kalenderereignissen für einen zukünftigen Zeitraum
Kombinieren von Daten aus verschiedenen Quellen zur Beantwortung von Fragen, z. B. „Wie bewerten andere die Dozenten meiner Kurse im nächsten Semester?“
Alle Tools sind schreibgeschützt. Das Projekt kann keine Beiträge verfassen, liken, kommentieren, Aufgaben abgeben, Noten ändern oder Schuldaten modifizieren.
Related MCP server: iGuat-MCP
Live-Demo
Die folgenden Screenshots stammen aus echten Aufrufen über die OpenCode-CLI auf Windows. Die konkreten Antworten werden vom verwendeten Modell auf Basis der von MCP zurückgegebenen Daten generiert, geben nicht die Meinung der Projektautoren wieder und können sich mit Modell- und Datenaktualisierungen ändern.
Zusammenfassung der heutigen Beiträge
Der Agent ruft list_today_posts auf, um die Beiträge des Tages zu erhalten, und erstellt dann eine kurze Zusammenfassung anhand von Titel, Inhalt und Interaktionen.

Dozenten- und Kursbewertungen
Der Agent sucht zunächst die zugehörigen Kurse des Dozenten und ruft dann get_course_reviews auf, um Kursmetadaten, Bewertungen, Kommentare und historische Informationen zu aggregieren.

Diskussionen zu Studienrichtungen
Wenn der Kurskatalog keinen exakten Treffer enthält, kann der Agent weiter in BIT101-Beiträgen suchen und relevante Diskussionen lesen – ein Beispiel für die Verkettung mehrerer MCP-Tools.

Lexue-Kalender
Der Agent kann Lexue-Ereignisse innerhalb von 7 bis 90 Tagen abfragen. Ein gültiger Kalender ohne anstehende Aufgaben liefert normalerweise eine leere Liste, statt „keine Aufgaben“ fälschlich als Schnittstellenfehler zu werten.

Vorbereitung vor der Verwendung
Derzeit empfohlene Umgebung:
Windows 10/11 oder Linux mit Desktop-Browser und verfügbarem System-Keyring (Fedora 43 + niri getestet)
Python 3.11 oder höher
Ein Client mit lokalem stdio-MCP-Support, z. B. Codex, OpenCode, Cursor oder Claude Code
BIT101-Konto
Für Stundenplan- und Notenabfragen zusätzlich ein Konto der einheitlichen Authentifizierung der Beijing Institute of Technology; bei manchen Anmeldungen kann eine SMS-Verifizierung erforderlich sein
Für Lexue-Abfragen muss einmalig eine private Kalender-Abonnement-URL aus Lexue exportiert werden
Installation
Deinem Agenten mitteilen (empfohlen)
Wenn dein Agent Terminalbefehle ausführen und seine eigene MCP-Konfiguration ändern kann, kannst du ihm direkt den folgenden Text senden:
请帮我安装并配置 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. 不要修改默认上游地址。完成后告诉我修改了哪些配置文件以及验证结果。Nach Abschluss der Installation durch den Agenten genügt in einem neuen Gespräch die Frage „Fasse die heutigen BIT101-Beiträge zusammen“, um die erste bedarfsgesteuerte Authentifizierung auszulösen.
Installation aus dem Quellcode
Sobald das Repository öffentlich ist, kann Folgendes ausgeführt werden:
git clone https://github.com/tiny-paris/BIT101-mcp.git
cd BIT101-mcp
uv sync --all-groups
uv tool install .uv tool install . installiert bit101-mcp als benutzerweiten Befehl. Mit dem folgenden Befehl kannst du das ausführbare Verzeichnis von uv anzeigen:
uv tool dir --binWenn der MCP-Client bit101-mcp nicht findet, starte den Client neu oder verwende in der Konfiguration den absoluten Pfad zu bit101-mcp.exe in diesem Verzeichnis.
Nur im Quellcode-Verzeichnis ausführen
Für Entwicklung oder Tests kann der Befehl auch ohne Installation verwendet werden:
uv sync --all-groups
uv run bit101-mcpEin stdio-MCP wartet nach dem normalen Start still auf Protokollnachrichten; ein „Einfrieren“ ist normal. Behandle es nicht wie ein normales interaktives Kommando und gib keine Kontodaten oder Passwörter in sein Terminal ein.
[!NOTE] Ein einfaches
uvx bit101-mcpwird erst unterstützt, wenn das Projekt auf PyPI veröffentlicht ist. Die aktuelle README setzt nicht voraus, dass ein PyPI-Paket bereits existiert.
Hinweise zu Abhängigkeiten
Das Projekt deklariert 7 direkte Laufzeitabhängigkeiten. Sie sind nicht alle „durch das MCP-Protokoll erzwungen“, sondern jeweils für die aktuell vollständigen Funktionen erforderlich:
Abhängigkeit | Verwendung im Projekt | Derzeit entfernbar? |
| MCP-stdio-Server, Tool-Registrierung, Kontext und Protokolltypen | Nein; dies ist die Kernabhängigkeit |
| Asynchroner/synchroner HTTPS-Client für BIT101, BIT-Login und Lexue-Kalender | Nein; alle Daten und die Authentifizierung benötigen Netzwerk |
| Speichert Sitzungen und Lexue-Abonnement-URLs im Betriebssystem-Schlüsselspeicher | Nein; ohne dies können Sitzungen nicht sicher prozessübergreifend wiederverwendet werden |
| Validierung und Parsing von aus Lexue exportierten ICS/iCalendar-Dateien | Nein; die Lexue-Funktion und der Import beim Start verwenden es |
| Expandiert Wiederholungsregeln (RRULE) im Lexue-Kalender | Nein; für wiederkehrende Ereignisse erforderlich |
| MCP-Tool-Parameterbereiche und JSON-Schema, z. B. Beitragsanzahl, Wochenversatz, Abfragetage | Nein; direkt im Quellcode verwendet, und das MCP-SDK basiert ebenfalls darauf |
| Stellt auf Windows die Zeitzonendatenbank | Nicht empfohlen zu entfernen; sonst können einige Windows/Python-Umgebungen „heute“ und Unterrichtswochen nicht korrekt berechnen |
Daher sind für die aktuelle Einzelpaketversion alle 7 Laufzeitabhängigkeiten; funktional gesehen dienen icalendar und python-dateutil jedoch nur Lexue. Falls sie in Zukunft als optionale Funktionen ausgegliedert werden, könnten sie zu zusätzlichen Abhängigkeiten werden. Eine Aufteilung jetzt würde die Installations- und Fehlerkomplexität erhöhen, während der eingesparte Umfang sehr begrenzt ist.
In uv.lock sind außerdem indirekte Abhängigkeiten wie anyio, httpcore, certifi zu sehen; sie werden automatisch von den oben genannten Bibliotheken mitgebracht, sind keine vom Projekt direkt aufgerufenen Top-Level-Komponenten und sollten nicht manuell installiert oder entfernt werden.
Die folgenden Abhängigkeiten dienen nur der Entwicklung und Veröffentlichung und werden nicht als normale Laufzeitabhängigkeiten installiert:
Abhängigkeit | Verwendung |
| Automatisierte Tests |
| Code- und Formatprüfung |
| Erstellung von Quell- und Wheel-Paketen |
MCP-Client konfigurieren
Die erste Schulauthentifizierung kann bis zu einigen Minuten dauern. Daher wird empfohlen, das Timeout für einzelne Tool-Aufrufe auf 360 Sekunden zu setzen. Nach der Konfiguration muss der MCP-Client neu gestartet werden, damit er einen neuen Dienstprozess startet.
Codex
Die Codex-CLI, die Codex-IDE-Erweiterung und der Codex-Host im ChatGPT-Desktop teilen sich die MCP-Konfiguration in config.toml. Offizielle Anleitung siehe Codex-MCP-Dokumentation.
Zuerst über die CLI hinzufügen:
codex mcp add bit101 -- bit101-mcp
codex mcp listDann die benutzerweite %USERPROFILE%\.codex\config.toml prüfen und das Tool-Timeout ergänzen:
[mcp_servers.bit101]
command = "bit101-mcp"
tool_timeout_sec = 360Wenn es nur in einem vertrauenswürdigen Projekt aktiviert werden soll, kann dieselbe Konfiguration in die .codex/config.toml dieses Projekts gelegt werden. Die benutzerweite Konfiguration funktioniert in beliebigen Verzeichnissen und neuen Gesprächen.
Wenn der Befehl nicht im PATH von Codex liegt, kann ein absoluter Pfad verwendet werden:
[mcp_servers.bit101]
command = 'C:\path\to\bit101-mcp.exe'
tool_timeout_sec = 360OpenCode
Dieses Projekt wurde mit der folgenden traditionellen OpenCode-Konfiguration auf Windows mit echter Hardware getestet. Eine opencode.json im Projektstammverzeichnis gilt nur für dieses Projekt; für die Verwendung in beliebigen Verzeichnissen lege sie in die benutzerweite ~/.config/opencode/opencode.json (unter Windows üblicherweise %USERPROFILE%\.config\opencode\opencode.json).
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"bit101": {
"type": "local",
"command": ["bit101-mcp"],
"enabled": true,
"timeout": 360000
}
}
}Verbindung prüfen:
opencode mcp listWenn der Start nur im Quellcode-Verzeichnis möglich ist, liegt das meist daran, dass die Konfiguration einen relativen Befehl verwendet und keine globale Installation vorliegt. Installiere bit101-mcp oder ändere command auf den absoluten Pfad von .venv\Scripts\bit101-mcp.exe.
OpenCode V2 hat eine andere Konfigurationsstruktur: Dienste liegen unter mcp.servers, das Ausführungs-Timeout unter mcp.timeout.execution. Maßgeblich ist die offizielle OpenCode-MCP-Dokumentation:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"timeout": {
"execution": 360000
},
"servers": {
"bit101": {
"type": "local",
"command": ["bit101-mcp"]
}
}
}
}Cursor
Gemäß der Cursor-MCP-Dokumentation liegt die globale Konfiguration in ~/.cursor/mcp.json, die Projektkonfiguration in .cursor/mcp.json:
{
"mcpServers": {
"bit101": {
"command": "bit101-mcp",
"args": []
}
}
}Nach dem Speichern Cursor neu starten und in der Liste der verfügbaren Tools des Agenten prüfen, dass bit101 aktiviert ist.
Claude Code
Gemäß der Claude-Code-MCP-Dokumentation einen benutzerweiten stdio-Dienst hinzufügen:
claude mcp add --scope user bit101 -- bit101-mcp
claude mcp listAllgemeine stdio-Konfiguration
Andere MCP-Clients müssen lediglich einen lokalen stdio-Prozess konfigurieren:
{
"command": "bit101-mcp",
"args": []
}Schreibe keine Kontodaten, Passwörter, Cookies, Tokens oder Lexue-URLs in die MCP-Konfiguration, Umgebungsvariablen oder Tool-Parameter.
Erste Schritte
Nach der Konfiguration kannst du direkt Fragen im Agenten-Gespräch stellen; ein manueller Start eines Hintergrunddienstes ist nicht erforderlich. Zum Beispiel:
BIT101-Community und Kurse
总结一下今天 BIT101 都有哪些帖子。
查找最近关于“数据结构”的讨论。
如何评价某某老师的某门课?请区分普遍评价和少数意见。
查找“特立自动化”相关讨论,并列出信息来源。Stundenplan und Noten
我今天有什么课?
我下周有什么课?按实际日期和开始时间排序。
列出本学期完整课表。
列出我的所有成绩,包括课程、学期、学分、成绩、班级平均分和最高分。Bei Fragen zu „diese/nächste Woche“ berechnet der Server die genaue Kalenderwoche anhand des aktuellen Datums und liefert vollständige Zeiten wie starts_at, ends_at; der Agent muss Unterrichtswochen oder Zeitfenster nicht selbst erraten.
Lexue
未来 14 天有哪些乐学任务?按截止时间排序。
看看未来 30 天的乐学日历。Verfügbare Tools
Tool | Funktion | Erforderliche Authentifizierung |
| Ruft BIT101-Beiträge des aktuellen Tages in der Zeitzone Shanghai ab | BIT101 |
| Sucht BIT101-Beiträge | BIT101 |
| Liest einen bestimmten Beitrag und zugehörige Informationen | BIT101 |
| Sucht Kurse und Dozenten | BIT101 |
| Aggregiert Kurs-, Dozenten-, Bewertungs- und historische Kursinformationen | BIT101 |
| Ruft die Kurse des heutigen Tages ab | Einheitliche Schulauthentifizierung |
| Ruft den datierten Stundenplan für diese, nächste oder eine relative Woche ab | Einheitliche Schulauthentifizierung |
| Ruft den vollständigen Stundenplan des aktuellen oder eines bestimmten Semesters ab | Einheitliche Schulauthentifizierung |
| Ruft Noten und verfügbare Klassenstatistiken ab | Einheitliche Schulauthentifizierung |
| Parst Lexue-Kalenderereignisse der nächsten 1–90 Tage | Schulauthentifizierung + Lexue-Abonnement-URL |
Erfolgreiche Ergebnisse haben einheitlich folgende Form:
{
"ok": true,
"data": {}
}Fehlerergebnisse enthalten keine Upstream-Stapelverfolgungen oder Authentifizierungsinformationen:
{
"ok": false,
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"service": "bit101",
"message": "BIT101 is temporarily unavailable.",
"retryable": true
}
}Technische Grundlagen
Der Kern ist in vier Schichten gegliedert:
MCP-Tool-Schicht: Setzt nur Benutzerkonzepte wie Beiträge, Kurse, Stundenpläne, Noten und Aufgaben aus; keine Cookies, Challenge-Tokens oder interne Dienstkennungen.
Client-Schicht: Behandelt BIT101-API und Schuldatengateway getrennt; bei Anfragefehlern wird geprüft, ob die Sitzung abgelaufen ist, und genau ein wiederherstellbarer Wiederholungsversuch unternommen.
Standardisierungsschicht: Wandelt verschiedene Upstream-Formate in stabile, JSON-freundliche Felder um; zuständig für Shanghai-Zeitzonendaten, Unterrichtswochen, Kurszeiten, Noten und ICS-Ereignisparsing.
Authentifizierungs- und Speicherschicht: Öffnet nur bei Bedarf eine lokale Seite; Passwörter gelangen nicht in MCP-Parameter; nach Erfolg wird nur die wiederverwendbare Sitzung gespeichert.
MCP verwendet den stdio-Transport. Die Standardausgabe sendet nur MCP-Protokolldaten, Laufzeitprotokolle werden ausschließlich auf die Standardfehlerausgabe geschrieben, damit Protokolle die Protokollkommunikation nicht stören.
Authentifizierungsablauf
Warum kann die BIT101-Anmeldung im Browser nicht direkt wiederverwendet werden?
Browser-Cookies gehören zum eigenen Sicherheitsbereich des Browsers; MCP ist ein unabhängiger lokaler Prozess. Das Projekt liest bewusst nicht die Cookie-Datenbank von Chrome/Edge und verlangt auch keine Browser-Erweiterung. Das bedeutet eine zusätzliche Erstauthentifizierung, vermeidet aber, dass MCP alle Browser-Anmeldedaten des Benutzers durchsucht.
Ein neues Agenten-Gespräch löscht den Anmeldestatus nicht. Beim MCP-Start werden gespeicherte Sitzungen gelesen und validiert; eine erneute Anmeldung erfolgt nur, wenn die Sitzung nicht existiert, der Upstream sie als ungültig einstuft, die temporäre Challenge des Authentifizierungsgateways abgelaufen ist oder der System-Schlüsselspeicher nicht verfügbar ist.
BIT101
Beim ersten Aufruf eines Community-Tools:
MCP startet eine temporäre Seite auf einem zufälligen Port von
127.0.0.1.Der Benutzer gibt auf der lokalen Seite Matrikelnummer und BIT101-Passwort ein.
Der lokale Prozess verarbeitet das Passwort gemäß dem bestehenden BIT101-Anmeldeprotokoll und sendet es per HTTPS an die BIT101-API.
Nach erfolgreicher Anmeldung wird nur die zurückgegebene BIT101-Sitzung im System-Schlüsselspeicher abgelegt; das ursprüngliche Passwort wird nicht dauerhaft gespeichert.
Die temporäre Seite wird geschlossen, der ursprüngliche Tool-Aufruf wird fortgesetzt.
Schulstundenplan und Noten
Stundenplan und Noten stammen aus der persönlichen Datenschnittstelle der Schule und sind nicht derselbe „Schlüssel“ wie die BIT101-Community-Sitzung. Beim ersten Aufruf sammelt die lokale Seite Konto, Passwort der einheitlichen Authentifizierung sowie bei Bedarf den SMS-Code und übergibt sie per HTTPS an das bestehende BIT-Login-REST-Gateway. MCP speichert die vom Gateway zurückgegebene kurzlebige Challenge-Sitzung, nicht das Schulpasswort.
Lexue-Kalender
Das aktuelle BIT-Login-REST-Gateway bietet keine Lexue-Kalenderschnittstelle, die dieses Projekt aufrufen könnte, und das Projekt implementiert auch das Schul-CAS/SSO nicht neu. Daher muss der Benutzer im MVP auf der Seite Kalender → Kalender exportieren in Lexue eine private Abonnement-URL erzeugen und sie einmal in der lokalen Verbindungsseite einfügen.
Die Verbindungsseite lädt den iCalendar-Inhalt tatsächlich herunter und validiert ihn; nur ein gültiges Abonnement zeigt Connected an. Eine normale calendar/view.php-Seite wird abgelehnt. Die Abonnement-URL gelangt nicht in Agenten- oder MCP-Tool-Ergebnisse und wird im System-Schlüsselspeicher abgelegt. Ein gültiger Kalender ohne anstehende Ereignisse liefert eine leere Liste.
Authentifizierung, Sicherheit und Datenschutz
Das Wichtigste zuerst
Dieses Projekt verringert das Risiko, dass Passwörter in Agenten, Chatverläufe und Protokolle gelangen, kann aber keine „Null-Risiko“-Garantie geben. Die Installation eines lokalen MCP entspricht der Installation eines netzwerkfähigen lokalen Programms; der Benutzer muss dem Projektquellcode, den Installationspaketen, den Abhängigkeiten und den konfigurierten entfernten Authentifizierungsdiensten vertrauen.
Besonders zu unterscheiden sind zwei Aussagen:
Passwörter werden nicht an den Agenten/LLM gesendet: Das ist eine explizit umgesetzte Grenze dieses Projekts.
Passwörter existieren nur auf diesem Rechner: Das ist nicht der Fall. Das Passwort der einheitlichen Schulauthentifizierung muss vom lokalen MCP per HTTPS an das konfigurierte entfernte BIT-Login-Gateway übermittelt werden, um die Authentifizierung abzuschließen.
Welche Informationen gehen wohin?
Information | Wer hat Zugriff | Wird dauerhaft gespeichert |
BIT101-Passwort | Lokaler Authentifizierungscode; nach dem Upstream-Protokoll verarbeitet und an die BIT101-API übermittelt | Passwort wird nicht gespeichert |
Passwort der einheitlichen Schulauthentifizierung | Lokaler Authentifizierungscode und konfiguriertes BIT-Login-Gateway | Wird nicht gespeichert |
SMS-Verifizierungscode | Lokaler Authentifizierungscode und BIT-Login-Gateway | Wird nicht gespeichert |
BIT101/Schulsitzung | Lokales MCP und entsprechender Upstream | Betriebssystem-Schlüsselspeicher |
Private Lexue-Abonnement-URL | Lokales MCP und der | Betriebssystem-Schlüsselspeicher |
Beiträge, Kurse, Stundenpläne, Noten, Lexue-Ereignisse | MCP und aktueller Agent | Gelangt in den Kontext des aktuellen Agenten |
Standardmäßige Upstream-Adressen:
BIT101-API:
https://bit101.flwfdd.xyzBIT-Login-REST:
https://login.bit101.flwfdd.xyz
HTTPS verhindert allgemeines Netzwerk-Mithören, ersetzt aber nicht das Vertrauen in den Serverbetreiber. Benutzer, die Bedenken haben, dass das Schulpasswort ein entferntes Gateway passiert, sollten die Stundenplan- und Noten-Tools nicht aktivieren.
Umgesetzte Schutzmaßnahmen
Der temporäre HTTP-Dienst bindet nur an
127.0.0.1und verwendet einen vom Betriebssystem zugewiesenen zufälligen Port.Jede Authentifizierung verwendet einen 256-Bit-Zufalls-
stateund einen Vergleich in konstanter Zeit gegen gefälschte Übermittlungen.Die Seite deaktiviert Cache, externe Inhalte, iframes, Referrer und MIME-Erraten.
Die Seite beendet das Lauschen nach Erfolg, Abbruch oder Timeout.
Passwörter und Verifizierungscodes werden nicht in Dateien geschrieben; der Code räumt die entsprechenden Variablenreferenzen so bald wie möglich nach der Anfrage auf.
Sitzungen werden über das Python-
keyringim Betriebssystem-Schlüsselspeicher abgelegt (Windows Credential Manager oder Linux Secret Service/Keyring-Backend); ist dies nicht verfügbar, werden sie nur im Speicher des aktuellen Prozesses gehalten, ohne Rückfall auf Klartextdateien.Protokolle maskieren Passwörter, Verifizierungscodes, Cookies, Bearer-Tokens und Authorization-Header.
Die Lexue-URL muss HTTPS unter der Domäne
bit.edu.cnverwenden und gültiges iCalendar zurückgeben.Alle Tools sind als schreibgeschützt markiert und bieten keine Möglichkeit, Schul- oder Community-Daten zu ändern.
Worauf der Benutzer achten sollte
Nur aus vertrauenswürdigen Repositories oder vertrauenswürdigen Veröffentlichungsseiten installieren und nach Möglichkeit Quellcode und Veröffentlichungshashes prüfen.
Die lokale Authentifizierungsseiten-URL sollte mit
http://127.0.0.1:<zufälliger Port>/connectbeginnen.Niemals Passwörter, Verifizierungscodes, Cookies, Tokens oder Lexue-URLs im Agenten-Chatfeld, in MCP-Parametern, Issues oder Protokollen senden.
Persönliche Schulkonten nicht auf nicht vertrauenswürdigen öffentlichen Computern verwenden.
Die Lexue-Abonnement-URL ist ein privater Link, der „beim Besitz lesbar“ ist; sie sollte wie ein Passwort geschützt werden. Bei Verdacht auf Offenlegung in Lexue neu erzeugen.
Bei Noten- und Stundenplanabfragen werden die entsprechenden Daten dem aktuellen Agenten bereitgestellt. Entscheide anhand der Datenrichtlinie des verwendeten Modells und Clients selbst, ob du sie aktivierst.
Lokale Sitzungen löschen
Unter Windows Systemsteuerung → Anmeldeinformationsverwaltung → Windows-Anmeldeinformationen öffnen; unter Linux das Secret-Service-Verwaltungstool der aktuellen Desktop-Umgebung (üblicherweise GNOME Keyring oder KDE Wallet). Die folgenden Einträge mit dem Dienstnamen bit101-mcp löschen:
bit101-sessionschool-sessionlexue-calendar-url
Nach dem Löschen authentifiziert sich der nächste Aufruf des entsprechenden Tools erneut. Das Deinstallieren des Python-Pakets löscht diese Systemanmeldeinformationen nicht automatisch. Wenn unter Linux kein Keyring-Backend verfügbar ist, wird die Sitzung nur im Speicher des aktuellen Prozesses gehalten; nach einem MCP-Neustart ist eine erneute Anmeldung erforderlich.
Konfigurationsoptionen
Nicht-geheime Parameter dürfen nur über Umgebungsvariablen konfiguriert werden:
Variable | Standardwert | Verwendung |
|
| BIT101-API-Basisadresse |
|
| BIT-Login-REST-Basisadresse |
|
| Timeout für einzelne Upstream-HTTP-Anfragen, in Sekunden |
|
| Maximale Wartezeit der lokalen Authentifizierungsseite, in Sekunden |
Anmeldeinformationen und Sitzungen können nicht über Tool-Parameter oder Umgebungsvariablen konfiguriert werden. Das Ändern der Upstream-Adresse bedeutet, einem neuen Dienstbetreiber zu vertrauen; bitte vorsichtig verwenden.
Häufig gestellte Fragen
Muss der Agent im Projektverzeichnis gestartet werden?
Nein. Nach der Installation des Befehls mit uv tool install . und dem Eintrag des MCP in die benutzerweite Client-Konfiguration kann er aus beliebigen Verzeichnissen verwendet werden. Die opencode.json, .cursor/mcp.json oder .codex/config.toml im Projektstammverzeichnis gelten nur für das jeweilige Projekt.
Warum öffnet sich beim ersten Mal ein Browser?
Die Authentifizierung wird bedarfsgesteuert ausgelöst. Die erste Beitragsabfrage benötigt eine BIT101-Sitzung; die erste Stundenplan-/Notenabfrage benötigt eine Schulsitzung; die erste Lexue-Abfrage benötigt zusätzlich ein privates Kalenderabonnement. Passwörter und Abonnement-URLs dürfen nicht über den Chat laufen, daher wird eine temporäre lokale Seite zur Erfassung verwendet.
Warum verlangt MCP eine Anmeldung, obwohl die BIT101-Webseite bereits angemeldet ist?
Die Websitzung liegt in Browser-Cookies. MCP liest keine Browser-Cookies und muss daher eine eigene minimale Sitzung aufbauen. Das opfert den Komfort der einmaligen Erstanmeldung, vermeidet aber den direkten Zugriff auf alle Browser-Anmeldedaten.
Warum ist in neuen Gesprächen gelegentlich eine erneute Anmeldung nötig?
Neue Gespräche löschen Sitzungen nicht aktiv, aber MCP validiert die Upstream-Sitzung. Eine erneute Anmeldung erfolgt, wenn die Sitzung abgelaufen ist, vom Server widerrufen wurde, die Gateway-Challenge ungültig ist oder der System-Schlüsselspeicher nicht verfügbar ist. Wenn direkt nach erfolgreicher Anmeldung und sofortigem Neustart erneut gefragt wird, prüfe, ob im System-Schlüsselspeicher Einträge für bit101-mcp existieren.
Lexue zeigt Connected, warum gibt es keine Aufgaben?
Wenn die Abonnement-URL die iCalendar-Validierung besteht, bedeutet eine leere Liste in der Regel nur, dass im gewählten Zeitraum tatsächlich keine Ereignisse liegen. Du kannst den Abfragezeitraum von 7 auf 30 Tage erweitern, um das zu bestätigen.
Warum wirken die Schultools langsam?
Die erste Schulauthentifizierung, SMS-Verifizierung und der Abruf von Notendetails können länger dauern. Setze das MCP-Tool-Timeout auf 360 Sekunden und warte, bis der aktuelle Aufruf abgeschlossen ist; starte nicht mehrere Schultools gleichzeitig neu.
Der Befehl bit101-mcp wird nicht gefunden?
Führe uv tool dir --bin aus, um das Installationsverzeichnis zu finden, füge es zum PATH hinzu oder trage in der MCP-Konfiguration direkt den absoluten Pfad zu bit101-mcp.exe ein. Starte den Client nach der Änderung neu.
Fehlercodes
Code | Bedeutung |
| Eine BIT101-Sitzung muss aufgebaut werden |
| Eine Schulsitzung muss aufgebaut werden |
| Die gespeicherte Sitzung ist abgelaufen |
| Die Anmeldung war nicht erfolgreich oder die Anmeldeinformationen wurden vom Upstream nicht akzeptiert |
| Timeout beim Warten auf die lokale Authentifizierungsseite |
| Das Lexue-Abonnement existiert nicht, ist ungültig oder kein gültiger Kalender |
| Der angegebene Beitrag oder Datensatz existiert nicht |
| Der Upstream-Dienst ist vorübergehend nicht verfügbar; später erneut versuchen |
| Der Upstream hat unerkennbare Daten zurückgegeben |
Alle Fehler werden bereinigt; es werden keine Passwörter, Cookies, Tokens, Authorization-Header, rohe Stapelverfolgungen oder vollständige sensible Anfragen zurückgegeben.
Entwicklung
Projektstruktur:
src/bit101_mcp/
├── server.py # MCP 入口、工具注册和服务器说明
├── tools/ # Agent 可见的只读工具
├── clients/ # BIT101 与学校上游客户端
├── auth/ # 本地浏览器认证、状态机和凭据存储
├── models/ # 数据标准化、周次和 ICS 解析
└── logging_utils.py # stderr 日志和秘密脱敏Entwicklungsabhängigkeiten installieren und Prüfungen ausführen:
uv sync --all-groups
uv run ruff check .
uv run ruff format --check .
uv buildVor der Veröffentlichung validieren die Maintainer mit Mock-Tests, die nicht mit dem öffentlichen Repository verteilt werden, Datenstandardisierung, Authentifizierungsstatus, Geheimnis-Maskierung und Wiederholungsabläufe; diese Tests benötigen keine echten Konten. Integrationstests mit echten Konten bleiben manuell und optional; Testanmeldeinformationen sollten nicht in das Repository oder CI eingecheckt werden.
Danksagungen
Dank an das BIT101-Projekt und alle seine Mitwirkenden. Die von älteren Studierenden langjährig gepflegte Community, Kursbewertungen, Campus-Datenschnittstellen und Authentifizierungswerkzeuge haben das Campusleben der Studierenden erheblich erleichtert und bilden eine wichtige Grundlage für dieses Projekt.
Dieses Projekt bezieht sich insbesondere auf folgende Projekte und nutzt deren Schnittstellen und Dokumentationen:
BIT101 MCP ist ein unabhängig entwickelter inoffizieller MCP-Client, der über Netzwerkschnittstellen mit den zugehörigen Diensten interagiert. Die MIT-Lizenz dieses Repositories gilt nur für den originären Code dieses Projekts und ersetzt oder ändert keine Lizenzen der Upstream-Projekte.
Aktuelle Einschränkungen
Windows wurde mit den wichtigsten Abläufen auf echter Hardware getestet; Fedora 43 + niri wurde als lauffähig verifiziert, andere Linux-Desktop-Umgebungen wurden noch nicht einzeln verifiziert.
Lexue erfordert weiterhin das einmalige manuelle Einfügen einer exportierten privaten Kalender-Abonnement-URL.
Die Gültigkeitsdauer der Schulsitzung wird vom Upstream-Gateway bestimmt; eine dauerhafte Anmeldung ohne erneute Anmeldung kann nicht garantiert werden.
Notendurchschnitt und Bestnoten hängen davon ab, ob der Upstream für jeden Kurs Details bereitstellt.
Es wurden noch kein PyPI-Paket und keine eigenständige Windows-ausführbare Datei veröffentlicht.
Es werden keine Schreiboperationen angeboten.
Lizenz
Dieses Projekt verwendet die MIT License. Sie sind willkommen, es unter Beibehaltung der Urheberrechts- und Lizenzhinweise zu verwenden, zu modifizieren, zu verteilen und Verbesserungen einzureichen.
Beiträge
Issues und Pull Requests sind willkommen. Bitte geben Sie beim Melden eines Problems Folgendes an:
Betriebssystem, Python-, uv- und MCP-Client-Versionen
Verwendete Toolnamen und maskierte Fehlercodes
Ob eine lokale Authentifizierungsseite angezeigt wird
Reproduzierbare Schritte
Bitte übermitteln Sie keine Studentenausweisnummern, Passwörter, Verifizierungscodes, Cookies, Tokens, vollständige Anfrage-Header, 乐学-URLs oder andere persönliche Informationen.
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