waseda-portal
waseda-portal-mcp
Ein inoffizieller, lokaler, read-only MCP-Server, der Waseda Moodle, MyWaseda-Vorlesungsausfälle, den Web-Syllabus und den offiziellen akademischen Kalender der Waseda-Universität zusammenfasst. Er steht in keiner Verbindung zur Waseda-Universität und wird von dieser weder anerkannt, garantiert noch unterstützt.
Der Hauptzweck besteht darin, von einem MCP-Client zu fragen: „Zeig mir die Vorlesungen und Fristen von morgen“ und Vorlesungen, Ausfälle und Änderungen, Fristen des Tages sowie unvollständige überfällige Aufgaben mit Quellenangabe zu prüfen.
Unterstützte Datenquellen
Waseda Moodle: reguläre Kurse, Aktivitätstypen, strukturierte Start- und Fristzeiten, Abgabe- und Abschlussstatus
MyWaseda-Vorlesungsausfälle: Ausfälle und Änderungen für belegte Kurse in der initialen Ansicht nach dem Login
Web-Syllabus: Jahr, Kurs- und Klassen-Code, anbietende Einrichtung, Verantwortliche, Zieljahrgang, veröffentlichte Zielgruppe und Voraussetzungen, Wochentag und Zeitraum, Raum, Modus, Überblick, Plan, Bewertung, Prüfungsangaben
Offizieller akademischer Kalender der Waseda-Universität: Vorlesungsbeginn und -ende, Ferien, Feiertagsvorlesungen, Vorlesungsunterbrechungen, Prüfungszeiträume
Universitätslogos, Bildschirmaufnahmen, Lehrmaterialien, abgerufene Syllabus-Texte und reale personenbezogene Daten werden nicht in das Repository aufgenommen.
Voraussetzungen und Einrichtung
Node.js 22 oder höher
npm
Auf dem System installiertes Google Chrome
git clone https://github.com/TakeruF/waseda-portal-mcp.git
cd waseda-portal-mcp
npm install
npm run build
npm run authnpm run auth (oder nach dem Build waseda-portal-mcp auth) öffnet ein dediziertes Chrome-Profil. Der Login zu Waseda Moodle und MyWaseda erfolgt durch die Person selbst im Chrome; zuletzt öffnen Sie bitte unter MyWaseda „Vorlesungen → Vorlesungsbezogen → Ausfälle“. Wenn die Ausfallseite allein über die URL erreicht wird, wird der Authentifizierungsstatus gespeichert und das dedizierte Chrome automatisch geschlossen. Die CLI fragt weder Benutzername noch Passwort ab. Vorhandene Chrome-Profile oder Cookies aus der normalen Nutzung werden nicht kopiert.
Das standardmäßige dedizierte Profil liegt unter ~/.waseda-portal-mcp/chrome-profile, der vom Server geladene Authentifizierungsstatus unter ~/.waseda-portal-mcp/auth-state.json. Beide liegen außerhalb des Repositorys; die Authentifizierungsstatusdatei wird owner-only (0600) gesetzt. Die Speicherorte können über WASEDA_PORTAL_PROFILE_DIR und WASEDA_PORTAL_AUTH_STATE_PATH geändert werden. Chrome und der MCP-Server, die dasselbe dedizierte Profil verwenden, können nicht gleichzeitig gestartet werden.
MCP-Client-Konfiguration
Ersetzen Sie die absoluten Pfade durch Ihren tatsächlichen Checkout.
{
"mcpServers": {
"waseda-portal": {
"command": "node",
"args": ["/absolute/path/to/waseda-portal-mcp/dist/cli.js"]
}
}
}Zum Deaktivieren des Caches fügen Sie "--no-cache" zu args hinzu. Die Standardausgabe von stdio ist ausschließlich für das MCP-Protokoll reserviert; Betriebsmeldungen werden auf die Standardfehlerausgabe ausgegeben.
Werkzeuge
get_day_brief: integriert Vorlesungen, Änderungen, Fristen des Tages und unvollständige überfällige Aufgaben fürdate(YYYY-MM-DD)list_courses: normalerweise nur Kurse, deren Kategorie mit正規科目/beginnt; mitincludeNonRegularwerden auch Einführungskurse usw. einbezogenlist_deadlines: listet Aktivitäten mit Fristen innerhalb von ISO-8601-fromundtoauf. Normalerweise werden eingereichte und abgeschlossene ausgeschlossenlist_changes: listet Ausfälle und Änderungen im angegebenen Datumsbereich aufget_syllabus: gibt auscourseIdodersyllabusKeyDetails oder mehrdeutige Kandidaten zurücksearch_syllabi: durchsucht den Web-Syllabus des aktuellen Jahres unabhängig vom Belegungsstatus nach Kursname oder Inhalt
Der mode von search_syllabi ist course_name für bekannte Kursnamen und content, wenn Sie nach Lerninhalten suchen. Bei der Inhaltssuche wird natürlicher Text in maximal drei Wörter zerlegt. Der MCP-Client kann über relatedTerms bis zu drei kurze verwandte Begriffe übergeben und so die Anzahl der Suchen und die Absicht explizit machen.
{
"query": "日本の貨幣の歴史を学びたい",
"mode": "content",
"relatedTerms": ["貨幣", "通貨", "経済史"],
"maxResults": 3,
"useAcademicProfile": true
}Die Ergebnisse enthalten den vollständigen Syllabus, die in der offiziellen Suche übereinstimmenden Wörter, die abgeglichenen Felder und die lexikalische Relevanz. Wenn ein lokales Lernprofil eingerichtet ist, wird profileApplied true, und für jeden Kandidaten wird eine beratende Übereinstimmung zu Einrichtung, Jahrgang und Voraussetzungen mitgeliefert. Die Inhaltssuche ist keine Garantie für eine semantische Kursempfehlung oder die Berechtigung zur Kursbelegung.
Optionales lokales Lernprofil
Nur die von der Person explizit angegebenen minimalen Lerninformationen können optional, standardmäßig unter ~/.waseda-portal-mcp/academic-profile.json, gespeichert werden. Es gibt keine Funktion, Name, Studentennummer, Einrichtung, Jahrgang oder Belegungshistorie automatisch aus MyWaseda oder Moodle abzurufen.
{
"schemaVersion": 1,
"affiliations": ["例示学部"],
"academicLevel": "undergraduate",
"year": 3,
"completedPrerequisites": ["合成基礎科目"]
}affiliations enthält bis zu fünf offizielle Fakultäts- und Graduiertenschulnamen, academicLevel ist undergraduate, masters, doctoral oder other, year ist 1 bis 6. In completedPrerequisites trägt die Person selbst nur bis zu 30 Kursnamen und Voraussetzungen ein, die für den Abgleich verwendet werden sollen. Da dies der Belegungshistorie entspricht, kann es weggelassen werden, wenn es nicht benötigt wird.
Setzen Sie das übergeordnete Verzeichnis auf 0700 und die Datei auf 0600 und legen Sie sie außerhalb des Repositorys ab. Wenn die Datei nicht existiert, wird wie bisher gesucht. Für einen anderen Speicherort kann WASEDA_PORTAL_ACADEMIC_PROFILE_PATH verwendet werden. Dateien mit zu weit gefassten Berechtigungen oder Dateien, die anderen Benutzern gehören, werden nicht gelesen.
Profilwerte werden nicht in MCP-Antworten, Logs, Snapshots oder Caches dupliziert. Ausgegeben werden nur profileApplied und die Begründung der verdeckten Bewertungen consistent, conflict, review_required und unavailable. Mit useAcademicProfile: false pro Aufruf wird das Profil nicht verwendet.
Datums- und Zeitangaben werden in ISO 8601 gehalten; wenn die Ursprungsseite keine Zeitzone angibt, werden sie als Asia/Tokyo interpretiert. Alle Ergebnisse enthalten die Quell-URL und den Prüfzeitpunkt. Bei Konflikten gilt die Reihenfolge MyWaseda, Moodle-Strukturinformationen, Web-Syllabus, Freitext.
Read-only-Garantie
Der normale Abruf besteht nur aus Seitenanzeige und DOM-Lesen. ReadOnlyGuard lehnt bekannte URLs für Aufgabenabgabe, Uploads, Quiz- und Umfrageantworten, Anwesenheit, Abschlussänderungen, Terminerstellung, Beiträge, Nachrichten und Belegungsänderungen sowie nicht erlaubte Nicht-GET-Anfragen ab.
Nur das offizielle Suchformular des Web-Syllabus verwendet trotz Suche HTTP POST. Daher wird ausschließlich der Such-POST eng zugelassen, bei dem der offizielle Host, /syllabus/JAA101.php und der read-only-Controller JAA103SubCon alle übereinstimmen. Auch für das verzögerte Laden von Moodle werden nur bekannte referenzierende Methoden für /lib/ajax/service.php zugelassen. Detailseiten werden per GET gelesen. Der Authentifizierungsablauf läuft in einem separaten Prozess; die Eingabe und Übermittlung der Anmeldedaten erfolgt durch die Person selbst.
Noten, Bewertungen, Dozenten-Feedback und Namen eingereichter Dateien existieren nicht im Modell und sind auch nicht in normalen Antworten enthalten. Moodle-Externalkalender-Token werden weder ausgestellt, gespeichert noch verwendet.
Personenbezogene Daten und Cache
Authentifiziertes HTML wird nach der Analyse im Speicher verworfen und nicht dauerhaft gespeichert. Cookies und Sitzungstoken befinden sich ausschließlich im dedizierten Profil und in der Authentifizierungsstatusdatei außerhalb des Repositorys und werden nicht in MCP-Antworten oder Logs ausgegeben. Das optionale Lernprofil wird ebenfalls beim Start einmal aus einer owner-only-Datei außerhalb des Repositorys gelesen; die Werte werden nicht in Antworten oder Caches gespeichert. Nur normalisierte Minimaldaten werden standardmäßig fünf Minuten im Prozessspeicher zwischengespeichert. Die TTL wird über WASEDA_PORTAL_CACHE_TTL_MS gesteuert, die Deaktivierung über --no-cache oder WASEDA_PORTAL_CACHE=false.
Nur die bestätigte Zuordnung courseId → syllabusKey kann zur Reduzierung erneuter Suchen unter ~/.waseda-portal-mcp/cache/course-syllabus-map.json gespeichert werden. Diese Zuordnungstabelle enthält keine Kursnamen, Verantwortlichennamen oder Studentennummern und wird atomar mit Verzeichnis 0700 und Datei 0600 aktualisiert. Mehrdeutige Kandidaten oder fehlende Übereinstimmungen werden nicht gespeichert.
Alle Fixtures sind künstliche Daten. Fügen Sie keine echten Daten in Issues, Logs, Fixtures oder Testausgaben ein. Weitere Details finden Sie in SECURITY.md.
Fehler
Es werden AUTH_REQUIRED, SESSION_EXPIRED, MAINTENANCE, SOURCE_UNAVAILABLE, PAGE_STRUCTURE_CHANGED, AMBIGUOUS_COURSE_MATCH, RATE_LIMITED und READ_ONLY_VIOLATION unterschieden. Wenn wichtige Selektoren verschwinden, wird ein leeres Array nicht als Erfolg behandelt, sondern PAGE_STRUCTURE_CHANGED zurückgegeben. Ein leeres Array wird nur zurückgegeben, wenn der reguläre Container für leere Listen bestätigt werden konnte.
Führen Sie bei fehlender Authentifizierung npm run auth aus. Bei Strukturänderungen reproduzieren Sie die minimale DOM-Struktur ohne personenbezogene Daten als künstliches Fixture und aktualisieren den betreffenden Parser und die Fixture-Tests. Fügen Sie authentifiziertes rohes HTML nicht in Issues oder Commits ein.
Entwicklung und Verifikation
npm test # 外部アクセスなしの人工fixtureテスト
npm run typecheck
npm run lint
npm run format:check
npm run build
npm run test:live:auth-state # 新規一時プロファイルでAUTH_REQUIREDを確認
npm run test:live:authenticated # 認証必須。AUTH_REQUIRED/SESSION_EXPIREDは失敗
npm run test:live:catalog # 公開シラバスの内容検索と科目名検索
npm run test:e2e:authenticated # ビルド後、MCPクライアントからstdio E2E
npm run test:e2e:catalog # search_syllabiのstdio E2Etest:live ist ein Alias für test:live:authenticated. Die authentifizierungspflichtige Live-Verifikation ist auf eine gleichzeitige Ausführung, ein Zugriffsintervall von einer Sekunde, einen regulären Kurs, maximal drei Syllabus-Kandidaten und maximal ein Aufgabendetail begrenzt. Ohne Authentifizierung schlägt sie fehl und wird nicht als Erfolg behandelt. Fixture-Erfolg, authentifizierter Live-Erfolg und MCP-Client-E2E-Erfolg sind als getrennte Nachweise zu behandeln.
Bekannte Einschränkungen
DOM-Änderungen an Moodle, MyWaseda und dem Web-Syllabus können Parser-Updates erforderlich machen.
Die Inhaltssuche ist eine lexikalische Suche über die Stichwortsuche aller Felder des offiziellen Web-Syllabus. Synonyme und abstrakte Interessen werden über
relatedTermsergänzt, begrenzt auf maximal drei Suchen und maximal fünf Details.Die Bewertung durch das Lernprofil ist beratend. Der Zieljahrgang, der im Web-Syllabus ein eigenständiges Feld ist, wird strukturell abgeglichen, aber die anbietende Einrichtung wird nicht als Zugehörigkeitsbeschränkung betrachtet. Wenn Zielgruppe, Voraussetzungskurse, Kapazität und Registrierungszeitraum in Freitext oder Fakultätsrichtlinien stehen, wird nicht automatisch auf Belegbarkeit geschlossen; die offiziellen Informationen müssen geprüft werden.
MyWaseda unterstützt nur die initiale Ansicht für belegte Kurse; die POST-Operation für die fakultätsweite Anzeige ist nicht implementiert.
Vorlesungstermine werden aus dem bestätigten Wochentag und Zeitraum des Syllabus sowie Semester und Ferientagen generiert. Freitexte zu Intensivkursen, Zusatzvorlesungen und einzelnen Terminen werden nicht als sicher angenommen.
Der Abgleich von Moodle und Syllabus basiert auf Jahr, anbietender Einrichtung, normalisiertem Kursnamen, Klasse, Verantwortlichen und, falls verfügbar, Wochentag und Zeitraum. Wenn sich Moodle-Name und Syllabus-Name unterscheiden, werden über eine Teilübereinstimmung des Verantwortlichen bis zur maximalen Anzahl Kandidaten abgerufen. Bei schwacher Begründung oder geringem Abstand der obersten Kandidaten werden nur mehrdeutige Kandidaten zurückgegeben; Raum- und Prüfungsinformationen werden nicht bestätigt.
Dauerhafte Benachrichtigungen, Schreibvorgänge, Notenabruf, Massenabruf von Lehrmaterialien, Kalendertoken, Chrome-Erweiterungen, Cloud-Authentifizierung, Remote-MCP und mehrere Universitäten sind nicht abgedeckt.
Adapter für andere Universitäten
Gemeinsam ist nicht die Abrufmethode, sondern das Ergebnis, das die Nutzer benötigen. Implementieren Sie zunächst UniversityAdapter innerhalb desselben Pakets; universitätsspezifische Selektoren, IDs und Abgleichsregeln liegen unter dem Adapter. Universitätsspezifische Informationen kommen in extensions. Erst wenn die tatsächlichen Grenzen mit einer zweiten Universität bestätigt sind, wird in ein separates Paket aufgeteilt. Weitere Details finden Sie in docs/architecture.md.
Lizenz
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
An MCP server for deep research or task groups
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TakeruF/waseda-portal-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server