CLI und MCP-Server für das Schulportal Hessen (Lanis): Vertretungsplan, Kalender, Aufgaben
337
Zugriff auf das Schulportal Hessen (Lanis) aus dem Terminal und aus KI-Assistenten: Vertretungsplan, Stundenplan, Kalender, Hausaufgaben, Nachrichten, Dateien und mehr.
Das Image enthält die Kommandozeile lanis und den MCP-Server für KI-Assistenten wie Claude. lanis liest nur, es verändert keine Daten im Schulportal.
Quellcode, vollständige Dokumentation und das Python-Paket: github.com/udondan/lanis
latest: neuestes ReleaseX.Y.Z: genau diese VersionX.Y, X: neuestes Release dieser Minor- bzw. Major-VersionPlattformen: linux/amd64 und linux/arm64.
Die Zugangsdaten kommen aus Umgebungsvariablen:
| Variable | Bedeutung |
|---|---|
LANIS_SCHOOL_ID | Schul-ID (siehe unten) |
LANIS_USERNAME | Benutzername, z. B. vorname.nachname |
LANIS_PASSWORD | Passwort |
LANIS_DATA_DIR | optional: Verzeichnis für die Session |
Weitere Varianten (Schule nach Name und Stadt, Session-Cookie statt Passwort) stehen im README.
Die Schul-ID findest du ohne Anmeldung:
docker run --rm udondan/lanis --format markdown schools | grep -i "musterstadt"
Das Image führt den Befehl lanis aus. -e NAME ohne Wert übernimmt die Variable aus deiner Shell:
docker run --rm -e LANIS_SCHOOL_ID -e LANIS_USERNAME -e LANIS_PASSWORD udondan/lanis substitutions
Mit einem Volume für die Session und einem Alias verhält sich das Image wie ein installiertes lanis:
alias lanis='docker run --rm -e LANIS_SCHOOL_ID -e LANIS_USERNAME -e LANIS_PASSWORD -e LANIS_DATA_DIR=/data -v lanis-data:/data udondan/lanis'
lanis --format markdown tasks
lanis calendar --start 2026-11-01 --end 2026-11-30
Die Ausgabe ist JSON, mit --format markdown lesbarer Text. lanis --help zeigt alle Befehle: substitutions, timetable, calendar, tasks, conversations, files, file-distribution, votes, learning-groups und weitere.
Ohne Argument startet das Image den MCP-Server (stdio). Eintrag für Claude Desktop:
{
"mcpServers": {
"lanis": {
"command": "docker",
"args": ["run", "--rm", "-i", "-e", "LANIS_SCHOOL_ID", "-e", "LANIS_USERNAME", "-e", "LANIS_PASSWORD", "udondan/lanis"],
"env": {
"LANIS_SCHOOL_ID": "1234",
"LANIS_USERNAME": "vorname.nachname",
"LANIS_PASSWORD": "dein-passwort"
}
}
}
}
Mit dem Docker MCP Toolkit liegen die Zugangsdaten als Secrets in Docker Desktop statt im Klartext in der Client-Konfiguration:
mkdir -p ~/.docker/mcp/catalogs
curl -fsSL https://raw.githubusercontent.com/udondan/lanis/main/docker-mcp.yml -o ~/.docker/mcp/catalogs/lanis.yml
docker mcp profile create --name lanis --id lanis --server "file://$HOME/.docker/mcp/catalogs/lanis.yml"
docker mcp secret set lanis.school_id=1234
docker mcp secret set lanis.username=vorname.nachname
docker mcp secret set lanis.password=dein-passwort
docker mcp client connect claude-desktop --profile lanis
Details im README.
Die Images sind mit cosign signiert, über den Release-Workflow auf GitHub:
cosign verify udondan/lanis:latest \
--certificate-identity-regexp '^https://github\.com/udondan/(py)?lanis/\.github/workflows/publish\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
Jedes Image enthält außerdem SBOM und Provenance-Attestierungen.
Der Container läuft als unprivilegierter Benutzer (UID 10001). Das Image basiert auf dem offiziellen Python-Image für Alpine, ohne pip.
Content type
Image
Digest
sha256:d51eaf4cf…
Size
43.8 MB
Last updated
about 21 hours ago
docker pull udondan/lanis