pylanis 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pylanis-0.2.0/.gitignore +13 -0
- pylanis-0.2.0/LICENSE +21 -0
- pylanis-0.2.0/PKG-INFO +343 -0
- pylanis-0.2.0/README.md +313 -0
- pylanis-0.2.0/pyproject.toml +66 -0
- pylanis-0.2.0/src/lanis_mcp/__init__.py +1 -0
- pylanis-0.2.0/src/lanis_mcp/client.py +239 -0
- pylanis-0.2.0/src/lanis_mcp/server.py +1722 -0
- pylanis-0.2.0/tests/test_lanis.py +988 -0
pylanis-0.2.0/.gitignore
ADDED
pylanis-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Daniel Schroeder
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
pylanis-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: pylanis
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: MCP server for Schulportal Hessen (Lanis), with SDK and CLI to follow
|
|
5
|
+
Project-URL: Repository, https://github.com/udondan/pylanis
|
|
6
|
+
Project-URL: Issues, https://github.com/udondan/pylanis/issues
|
|
7
|
+
Project-URL: Changelog, https://github.com/udondan/pylanis/blob/main/CHANGELOG.md
|
|
8
|
+
Author-email: Daniel Schroeder <deemes79@googlemail.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: hessen,lanis,mcp,mcp-server,school,schulportal,vertretungsplan
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: Natural Language :: German
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Topic :: Education
|
|
18
|
+
Requires-Python: >=3.11
|
|
19
|
+
Requires-Dist: lanisapi==0.4.1
|
|
20
|
+
Requires-Dist: mcp[cli]==2.3.0
|
|
21
|
+
Requires-Dist: selectolax==0.4.13
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: anyio==4.15.1; extra == 'dev'
|
|
24
|
+
Requires-Dist: build==1.6.1; extra == 'dev'
|
|
25
|
+
Requires-Dist: pytest-asyncio==1.4.1; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest-cov==7.1.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest==9.1.1; extra == 'dev'
|
|
28
|
+
Requires-Dist: ruff==0.17.2; extra == 'dev'
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
|
|
31
|
+
# pylanis
|
|
32
|
+
|
|
33
|
+
Ein [MCP-Server](https://modelcontextprotocol.io/) für das **Schulportal Hessen (Lanis)**, der KI-Assistenten wie Claude ermöglicht, direkt auf Schulinformationen zuzugreifen – Vertretungsplan, Kalender, Hausaufgaben, Nachrichten und mehr.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Was ist pylanis?
|
|
38
|
+
|
|
39
|
+
`pylanis` verbindet deine KI (z. B. Claude) mit dem [Schulportal Hessen](https://start.schulportal.hessen.de/). Sobald der Server eingerichtet ist, kannst du deiner KI ganz natürlich Fragen stellen wie:
|
|
40
|
+
|
|
41
|
+
> „Was steht heute im Vertretungsplan?"
|
|
42
|
+
> „Welche Hausaufgaben habe ich diese Woche?"
|
|
43
|
+
> „Zeig mir alle Termine im April."
|
|
44
|
+
|
|
45
|
+
Der Server kommuniziert über das standardisierte MCP-Protokoll und ist **ausschließlich lesend** – er verändert keine Daten im Schulportal.
|
|
46
|
+
|
|
47
|
+
Das Paket wird auf [PyPI](https://pypi.org/project/pylanis/) als `pylanis` veröffentlicht. Bisher enthält es den MCP-Server (Befehl `lanis-mcp`). Ein Python-SDK und ein Kommandozeilenwerkzeug für das Schulportal sollen folgen.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Voraussetzungen
|
|
52
|
+
|
|
53
|
+
- Ein aktiver **Lanis-Account** (Schulportal Hessen)
|
|
54
|
+
- Die **Schul-ID** deiner Schule (siehe [Schul-ID herausfinden](#schul-id-herausfinden))
|
|
55
|
+
- [`uv`](https://docs.astral.sh/uv/) installiert (modernes Python-Paketverwaltungstool)
|
|
56
|
+
- Ein MCP-kompatibler Client, z. B. [Claude Desktop](https://claude.ai/download)
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Einrichtung
|
|
61
|
+
|
|
62
|
+
### Schul-ID herausfinden
|
|
63
|
+
|
|
64
|
+
Falls du deine Schul-ID nicht kennst, kannst du sie über das Tool `get_schools` ermitteln. Frage deine KI einfach:
|
|
65
|
+
|
|
66
|
+
> „Suche die Schul-ID für die [Name deiner Schule] in [Stadt]."
|
|
67
|
+
|
|
68
|
+
Das Tool `get_schools` benötigt **keine Anmeldung** und listet alle Schulen im Schulportal Hessen mit ihrer ID auf.
|
|
69
|
+
|
|
70
|
+
### Claude Desktop konfigurieren
|
|
71
|
+
|
|
72
|
+
Öffne die Konfigurationsdatei von Claude Desktop:
|
|
73
|
+
|
|
74
|
+
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
75
|
+
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
76
|
+
|
|
77
|
+
Füge einen Eintrag unter `mcpServers` hinzu. Wähle einen der drei Authentifizierungsmodi:
|
|
78
|
+
|
|
79
|
+
#### Modus 1 – Benutzername & Passwort (empfohlen)
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"mcpServers": {
|
|
84
|
+
"lanis": {
|
|
85
|
+
"command": "uvx",
|
|
86
|
+
"args": ["--from", "pylanis", "lanis-mcp"],
|
|
87
|
+
"env": {
|
|
88
|
+
"LANIS_SCHOOL_ID": "1234",
|
|
89
|
+
"LANIS_USERNAME": "vorname.nachname",
|
|
90
|
+
"LANIS_PASSWORD": "dein-passwort"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### Modus 2 – Session-Cookie (schneller, kein Passwort)
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"mcpServers": {
|
|
102
|
+
"lanis": {
|
|
103
|
+
"command": "uvx",
|
|
104
|
+
"args": ["--from", "pylanis", "lanis-mcp"],
|
|
105
|
+
"env": {
|
|
106
|
+
"LANIS_SCHOOL_ID": "1234",
|
|
107
|
+
"LANIS_SESSION_ID": "dein-session-cookie"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
> **Hinweis:** Der Session-Cookie läuft nach einiger Zeit ab. Bei Ablauf gibt der Server eine entsprechende Fehlermeldung zurück – einfach die Anfrage wiederholen oder auf Modus 1 wechseln.
|
|
115
|
+
|
|
116
|
+
#### Modus 3 – Schule nach Name & Stadt
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"mcpServers": {
|
|
121
|
+
"lanis": {
|
|
122
|
+
"command": "uvx",
|
|
123
|
+
"args": ["--from", "pylanis", "lanis-mcp"],
|
|
124
|
+
"env": {
|
|
125
|
+
"LANIS_SCHOOL_NAME": "Mustergymnasium",
|
|
126
|
+
"LANIS_SCHOOL_CITY": "Musterstadt",
|
|
127
|
+
"LANIS_USERNAME": "vorname.nachname",
|
|
128
|
+
"LANIS_PASSWORD": "dein-passwort"
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Nach dem Speichern Claude Desktop neu starten.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Docker MCP
|
|
140
|
+
|
|
141
|
+
### Docker-Image bauen und registrieren
|
|
142
|
+
|
|
143
|
+
Voraussetzung: [`mise`](https://mise.jdx.dev) installiert.
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Nur bauen
|
|
147
|
+
mise run docker-build
|
|
148
|
+
|
|
149
|
+
# Nur im Docker MCP Katalog registrieren
|
|
150
|
+
mise run docker-register
|
|
151
|
+
|
|
152
|
+
# Beides nacheinander
|
|
153
|
+
mise run docker
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Verfügbare Tools
|
|
159
|
+
|
|
160
|
+
Alle Tools sind **nur lesend** und verändern keine Daten. Die meisten Tools unterstützen die Ausgabeformate `markdown` (Standard, für Menschen lesbar) und `json` (maschinenlesbar).
|
|
161
|
+
|
|
162
|
+
### Einrichtung
|
|
163
|
+
|
|
164
|
+
| Tool | Beschreibung | Auth erforderlich |
|
|
165
|
+
| ------------------------ | -------------------------------------------------------------------- | :---------------: |
|
|
166
|
+
| `get_schools` | Listet alle Schulen im Schulportal Hessen mit ID, Name und Stadt | ❌ |
|
|
167
|
+
| `get_available_apps` | Zeigt, welche der unterstützten Apps an deiner Schule verfügbar sind | ✅ |
|
|
168
|
+
| `check_app_availability` | Prüft, ob eine bestimmte App an deiner Schule verfügbar ist | ✅ |
|
|
169
|
+
|
|
170
|
+
### Stundenplan & Unterricht
|
|
171
|
+
|
|
172
|
+
| Tool | Beschreibung | Parameter | Auth erforderlich |
|
|
173
|
+
| ----------------------- | ------------------------------------------------------------------- | --------- | :---------------: |
|
|
174
|
+
| `get_substitution_plan` | Heutiger Vertretungsplan (Klasse, Fach, Raum, Lehrer, Hinweise) | – | ✅ |
|
|
175
|
+
| `get_timetable` | Wöchentlicher Stundenplan (Fach, Raum, Lehrer je Stunde und Tag) | – | ✅ |
|
|
176
|
+
| `get_learning_groups` | Lerngruppen/Kurse, in denen du eingeschrieben bist, inkl. Lehrkraft | – | ✅ |
|
|
177
|
+
|
|
178
|
+
### Kalender
|
|
179
|
+
|
|
180
|
+
| Tool | Beschreibung | Parameter | Auth erforderlich |
|
|
181
|
+
| ----------------------- | ------------------------------------------------ | -------------------------------------------------- | :---------------: |
|
|
182
|
+
| `get_calendar` | Schulkalender für einen beliebigen Zeitraum | `start`, `end` (JJJJ-MM-TT), `include_responsible` | ✅ |
|
|
183
|
+
| `get_calendar_of_month` | Schulkalender für den aktuellen Monat (Kurzform) | `include_responsible` | ✅ |
|
|
184
|
+
|
|
185
|
+
> **Hinweis zu `include_responsible`:** Wenn `true`, wird für jeden Termin eine zusätzliche API-Anfrage gestellt. Bei vielen Terminen kann dies langsam sein.
|
|
186
|
+
|
|
187
|
+
### Hausaufgaben & Aufgaben
|
|
188
|
+
|
|
189
|
+
| Tool | Beschreibung | Auth erforderlich |
|
|
190
|
+
| ----------- | ------------------------------------------------------------------------------------- | :---------------: |
|
|
191
|
+
| `get_tasks` | Aufgaben und Hausaufgaben aus „Mein Unterricht" (Fach, Lehrer, Beschreibung, Anhänge) | ✅ |
|
|
192
|
+
|
|
193
|
+
### Nachrichten
|
|
194
|
+
|
|
195
|
+
| Tool | Beschreibung | Parameter | Auth erforderlich |
|
|
196
|
+
| ------------------- | ----------------------------------------- | ------------------------------------ | :---------------: |
|
|
197
|
+
| `get_conversations` | Nachrichten aus dem „Nachrichten"-Bereich | `number` (Standard: 10, `-1` = alle) | ✅ |
|
|
198
|
+
|
|
199
|
+
> **Hinweis:** `-1` lädt alle Nachrichten und kann den Lanis-Server stark belasten. Bitte sparsam verwenden.
|
|
200
|
+
|
|
201
|
+
### Dateien
|
|
202
|
+
|
|
203
|
+
| Tool | Beschreibung | Parameter | Auth erforderlich |
|
|
204
|
+
| ----------------------- | --------------------------------------------------------------------------- | --------------------------------------- | :---------------: |
|
|
205
|
+
| `get_file_storage` | Inhalt des Schulischen Dateispeichers (Ordner & Dateien mit Download-Links) | `folder_id` (optional, für Unterordner) | ✅ |
|
|
206
|
+
| `get_file_distribution` | Verteilte Dateien und Ankündigungen (Dateiverteilung / GRB Infos) | – | ✅ |
|
|
207
|
+
|
|
208
|
+
### Portal
|
|
209
|
+
|
|
210
|
+
| Tool | Beschreibung | Auth erforderlich |
|
|
211
|
+
| ------------- | ---------------------------------------------------------------- | :---------------: |
|
|
212
|
+
| `get_apps` | Alle App-Kacheln auf dem Lanis-Dashboard (Name, Link, Kategorie) | ✅ |
|
|
213
|
+
| `get_folders` | Ordner/Kategorien auf dem Lanis-Dashboard | ✅ |
|
|
214
|
+
| `get_votes` | Aktive Abstimmungen und Wahlen (z. B. Schülerratswahl) | ✅ |
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Beispiele
|
|
219
|
+
|
|
220
|
+
Hier sind typische Fragen, die du deiner KI stellen kannst:
|
|
221
|
+
|
|
222
|
+
### Einrichtung & Überblick
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
Welche Schul-ID hat das Gymnasium Musterstadt?
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
Welche Lanis-Apps sind an meiner Schule verfügbar?
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Stundenplan & Vertretung
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
Was steht heute im Vertretungsplan?
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
Zeig mir meinen Stundenplan für diese Woche.
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
In welchen Kursen bin ich eingeschrieben und wer sind meine Lehrkräfte?
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
Wer vertritt heute Herrn Müller in der 3. Stunde?
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Kalender
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
Welche Schultermine gibt es im April?
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
Zeig mir alle Termine zwischen dem 1. und 15. März.
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
Was sind die nächsten Schulveranstaltungen diesen Monat?
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Hausaufgaben & Aufgaben
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
Welche Hausaufgaben habe ich aktuell?
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
Gibt es Aufgaben mit Anhängen, die ich herunterladen kann?
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
Was muss ich für Mathematik vorbereiten?
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Nachrichten
|
|
279
|
+
|
|
280
|
+
```
|
|
281
|
+
Zeig mir meine letzten 5 Nachrichten.
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
Habe ich ungelesene Nachrichten?
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
Was hat die Schule zuletzt kommuniziert?
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Dateien
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
Was liegt im Schulischen Dateispeicher?
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
Gibt es neue verteilte Dateien oder Ankündigungen?
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Ausgabeformate
|
|
305
|
+
|
|
306
|
+
Die meisten Tools unterstützen zwei Ausgabeformate:
|
|
307
|
+
|
|
308
|
+
- **`markdown`** (Standard): Für Menschen lesbar, ideal für die direkte Anzeige in der KI-Konversation
|
|
309
|
+
- **`json`**: Maschinenlesbar, nützlich wenn du die Daten weiterverarbeiten möchtest
|
|
310
|
+
|
|
311
|
+
Du kannst das Format in deiner Anfrage angeben:
|
|
312
|
+
|
|
313
|
+
```
|
|
314
|
+
Zeig mir den Vertretungsplan als JSON.
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
> **Hinweis:** Antworten sind auf **25.000 Zeichen** begrenzt. Bei sehr langen Ergebnissen wird die Ausgabe gekürzt und ein Hinweis angezeigt. Verwende in diesem Fall Filter (z. B. einen engeren Datumsbereich beim Kalender), um die Ergebnisse einzugrenzen.
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Fehlerbehebung
|
|
322
|
+
|
|
323
|
+
### „Session abgelaufen" / Session expired
|
|
324
|
+
|
|
325
|
+
Der Session-Cookie ist abgelaufen (nur bei Modus 2 relevant). Der Server setzt die Verbindung automatisch zurück. Einfach die Anfrage erneut stellen – beim nächsten Versuch wird eine neue Session aufgebaut.
|
|
326
|
+
|
|
327
|
+
### „App nicht verfügbar an deiner Schule"
|
|
328
|
+
|
|
329
|
+
Nicht alle Schulen haben alle Lanis-Module aktiviert. Mit `get_available_apps` kannst du prüfen, welche der unterstützten Apps an deiner Schule freigeschaltet sind.
|
|
330
|
+
|
|
331
|
+
### Kein Vertretungsplan verfügbar
|
|
332
|
+
|
|
333
|
+
Der Vertretungsplan ist nur an Schultagen verfügbar. An Wochenenden und Feiertagen gibt es keinen Plan.
|
|
334
|
+
|
|
335
|
+
Manche Schulen zeigen die App „Vertretungsplan“ an, nutzen sie aber nicht. Dann meldet `get_substitution_plan`, dass keine Vertretungsdaten vorliegen.
|
|
336
|
+
|
|
337
|
+
### Keine Termine / Aufgaben gefunden
|
|
338
|
+
|
|
339
|
+
Prüfe, ob du den richtigen Zeitraum angegeben hast. Für den Kalender müssen `start` und `end` im Format `JJJJ-MM-TT` angegeben werden.
|
|
340
|
+
|
|
341
|
+
### Verbindungsfehler
|
|
342
|
+
|
|
343
|
+
Stelle sicher, dass die Umgebungsvariablen in der Claude Desktop Konfiguration korrekt gesetzt sind und dass du Zugang zum Schulportal Hessen hast (ggf. VPN oder Schulnetzwerk erforderlich).
|
pylanis-0.2.0/README.md
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
# pylanis
|
|
2
|
+
|
|
3
|
+
Ein [MCP-Server](https://modelcontextprotocol.io/) für das **Schulportal Hessen (Lanis)**, der KI-Assistenten wie Claude ermöglicht, direkt auf Schulinformationen zuzugreifen – Vertretungsplan, Kalender, Hausaufgaben, Nachrichten und mehr.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Was ist pylanis?
|
|
8
|
+
|
|
9
|
+
`pylanis` verbindet deine KI (z. B. Claude) mit dem [Schulportal Hessen](https://start.schulportal.hessen.de/). Sobald der Server eingerichtet ist, kannst du deiner KI ganz natürlich Fragen stellen wie:
|
|
10
|
+
|
|
11
|
+
> „Was steht heute im Vertretungsplan?"
|
|
12
|
+
> „Welche Hausaufgaben habe ich diese Woche?"
|
|
13
|
+
> „Zeig mir alle Termine im April."
|
|
14
|
+
|
|
15
|
+
Der Server kommuniziert über das standardisierte MCP-Protokoll und ist **ausschließlich lesend** – er verändert keine Daten im Schulportal.
|
|
16
|
+
|
|
17
|
+
Das Paket wird auf [PyPI](https://pypi.org/project/pylanis/) als `pylanis` veröffentlicht. Bisher enthält es den MCP-Server (Befehl `lanis-mcp`). Ein Python-SDK und ein Kommandozeilenwerkzeug für das Schulportal sollen folgen.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Voraussetzungen
|
|
22
|
+
|
|
23
|
+
- Ein aktiver **Lanis-Account** (Schulportal Hessen)
|
|
24
|
+
- Die **Schul-ID** deiner Schule (siehe [Schul-ID herausfinden](#schul-id-herausfinden))
|
|
25
|
+
- [`uv`](https://docs.astral.sh/uv/) installiert (modernes Python-Paketverwaltungstool)
|
|
26
|
+
- Ein MCP-kompatibler Client, z. B. [Claude Desktop](https://claude.ai/download)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Einrichtung
|
|
31
|
+
|
|
32
|
+
### Schul-ID herausfinden
|
|
33
|
+
|
|
34
|
+
Falls du deine Schul-ID nicht kennst, kannst du sie über das Tool `get_schools` ermitteln. Frage deine KI einfach:
|
|
35
|
+
|
|
36
|
+
> „Suche die Schul-ID für die [Name deiner Schule] in [Stadt]."
|
|
37
|
+
|
|
38
|
+
Das Tool `get_schools` benötigt **keine Anmeldung** und listet alle Schulen im Schulportal Hessen mit ihrer ID auf.
|
|
39
|
+
|
|
40
|
+
### Claude Desktop konfigurieren
|
|
41
|
+
|
|
42
|
+
Öffne die Konfigurationsdatei von Claude Desktop:
|
|
43
|
+
|
|
44
|
+
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
45
|
+
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
46
|
+
|
|
47
|
+
Füge einen Eintrag unter `mcpServers` hinzu. Wähle einen der drei Authentifizierungsmodi:
|
|
48
|
+
|
|
49
|
+
#### Modus 1 – Benutzername & Passwort (empfohlen)
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"lanis": {
|
|
55
|
+
"command": "uvx",
|
|
56
|
+
"args": ["--from", "pylanis", "lanis-mcp"],
|
|
57
|
+
"env": {
|
|
58
|
+
"LANIS_SCHOOL_ID": "1234",
|
|
59
|
+
"LANIS_USERNAME": "vorname.nachname",
|
|
60
|
+
"LANIS_PASSWORD": "dein-passwort"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
#### Modus 2 – Session-Cookie (schneller, kein Passwort)
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"mcpServers": {
|
|
72
|
+
"lanis": {
|
|
73
|
+
"command": "uvx",
|
|
74
|
+
"args": ["--from", "pylanis", "lanis-mcp"],
|
|
75
|
+
"env": {
|
|
76
|
+
"LANIS_SCHOOL_ID": "1234",
|
|
77
|
+
"LANIS_SESSION_ID": "dein-session-cookie"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
> **Hinweis:** Der Session-Cookie läuft nach einiger Zeit ab. Bei Ablauf gibt der Server eine entsprechende Fehlermeldung zurück – einfach die Anfrage wiederholen oder auf Modus 1 wechseln.
|
|
85
|
+
|
|
86
|
+
#### Modus 3 – Schule nach Name & Stadt
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"mcpServers": {
|
|
91
|
+
"lanis": {
|
|
92
|
+
"command": "uvx",
|
|
93
|
+
"args": ["--from", "pylanis", "lanis-mcp"],
|
|
94
|
+
"env": {
|
|
95
|
+
"LANIS_SCHOOL_NAME": "Mustergymnasium",
|
|
96
|
+
"LANIS_SCHOOL_CITY": "Musterstadt",
|
|
97
|
+
"LANIS_USERNAME": "vorname.nachname",
|
|
98
|
+
"LANIS_PASSWORD": "dein-passwort"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Nach dem Speichern Claude Desktop neu starten.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Docker MCP
|
|
110
|
+
|
|
111
|
+
### Docker-Image bauen und registrieren
|
|
112
|
+
|
|
113
|
+
Voraussetzung: [`mise`](https://mise.jdx.dev) installiert.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Nur bauen
|
|
117
|
+
mise run docker-build
|
|
118
|
+
|
|
119
|
+
# Nur im Docker MCP Katalog registrieren
|
|
120
|
+
mise run docker-register
|
|
121
|
+
|
|
122
|
+
# Beides nacheinander
|
|
123
|
+
mise run docker
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Verfügbare Tools
|
|
129
|
+
|
|
130
|
+
Alle Tools sind **nur lesend** und verändern keine Daten. Die meisten Tools unterstützen die Ausgabeformate `markdown` (Standard, für Menschen lesbar) und `json` (maschinenlesbar).
|
|
131
|
+
|
|
132
|
+
### Einrichtung
|
|
133
|
+
|
|
134
|
+
| Tool | Beschreibung | Auth erforderlich |
|
|
135
|
+
| ------------------------ | -------------------------------------------------------------------- | :---------------: |
|
|
136
|
+
| `get_schools` | Listet alle Schulen im Schulportal Hessen mit ID, Name und Stadt | ❌ |
|
|
137
|
+
| `get_available_apps` | Zeigt, welche der unterstützten Apps an deiner Schule verfügbar sind | ✅ |
|
|
138
|
+
| `check_app_availability` | Prüft, ob eine bestimmte App an deiner Schule verfügbar ist | ✅ |
|
|
139
|
+
|
|
140
|
+
### Stundenplan & Unterricht
|
|
141
|
+
|
|
142
|
+
| Tool | Beschreibung | Parameter | Auth erforderlich |
|
|
143
|
+
| ----------------------- | ------------------------------------------------------------------- | --------- | :---------------: |
|
|
144
|
+
| `get_substitution_plan` | Heutiger Vertretungsplan (Klasse, Fach, Raum, Lehrer, Hinweise) | – | ✅ |
|
|
145
|
+
| `get_timetable` | Wöchentlicher Stundenplan (Fach, Raum, Lehrer je Stunde und Tag) | – | ✅ |
|
|
146
|
+
| `get_learning_groups` | Lerngruppen/Kurse, in denen du eingeschrieben bist, inkl. Lehrkraft | – | ✅ |
|
|
147
|
+
|
|
148
|
+
### Kalender
|
|
149
|
+
|
|
150
|
+
| Tool | Beschreibung | Parameter | Auth erforderlich |
|
|
151
|
+
| ----------------------- | ------------------------------------------------ | -------------------------------------------------- | :---------------: |
|
|
152
|
+
| `get_calendar` | Schulkalender für einen beliebigen Zeitraum | `start`, `end` (JJJJ-MM-TT), `include_responsible` | ✅ |
|
|
153
|
+
| `get_calendar_of_month` | Schulkalender für den aktuellen Monat (Kurzform) | `include_responsible` | ✅ |
|
|
154
|
+
|
|
155
|
+
> **Hinweis zu `include_responsible`:** Wenn `true`, wird für jeden Termin eine zusätzliche API-Anfrage gestellt. Bei vielen Terminen kann dies langsam sein.
|
|
156
|
+
|
|
157
|
+
### Hausaufgaben & Aufgaben
|
|
158
|
+
|
|
159
|
+
| Tool | Beschreibung | Auth erforderlich |
|
|
160
|
+
| ----------- | ------------------------------------------------------------------------------------- | :---------------: |
|
|
161
|
+
| `get_tasks` | Aufgaben und Hausaufgaben aus „Mein Unterricht" (Fach, Lehrer, Beschreibung, Anhänge) | ✅ |
|
|
162
|
+
|
|
163
|
+
### Nachrichten
|
|
164
|
+
|
|
165
|
+
| Tool | Beschreibung | Parameter | Auth erforderlich |
|
|
166
|
+
| ------------------- | ----------------------------------------- | ------------------------------------ | :---------------: |
|
|
167
|
+
| `get_conversations` | Nachrichten aus dem „Nachrichten"-Bereich | `number` (Standard: 10, `-1` = alle) | ✅ |
|
|
168
|
+
|
|
169
|
+
> **Hinweis:** `-1` lädt alle Nachrichten und kann den Lanis-Server stark belasten. Bitte sparsam verwenden.
|
|
170
|
+
|
|
171
|
+
### Dateien
|
|
172
|
+
|
|
173
|
+
| Tool | Beschreibung | Parameter | Auth erforderlich |
|
|
174
|
+
| ----------------------- | --------------------------------------------------------------------------- | --------------------------------------- | :---------------: |
|
|
175
|
+
| `get_file_storage` | Inhalt des Schulischen Dateispeichers (Ordner & Dateien mit Download-Links) | `folder_id` (optional, für Unterordner) | ✅ |
|
|
176
|
+
| `get_file_distribution` | Verteilte Dateien und Ankündigungen (Dateiverteilung / GRB Infos) | – | ✅ |
|
|
177
|
+
|
|
178
|
+
### Portal
|
|
179
|
+
|
|
180
|
+
| Tool | Beschreibung | Auth erforderlich |
|
|
181
|
+
| ------------- | ---------------------------------------------------------------- | :---------------: |
|
|
182
|
+
| `get_apps` | Alle App-Kacheln auf dem Lanis-Dashboard (Name, Link, Kategorie) | ✅ |
|
|
183
|
+
| `get_folders` | Ordner/Kategorien auf dem Lanis-Dashboard | ✅ |
|
|
184
|
+
| `get_votes` | Aktive Abstimmungen und Wahlen (z. B. Schülerratswahl) | ✅ |
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Beispiele
|
|
189
|
+
|
|
190
|
+
Hier sind typische Fragen, die du deiner KI stellen kannst:
|
|
191
|
+
|
|
192
|
+
### Einrichtung & Überblick
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
Welche Schul-ID hat das Gymnasium Musterstadt?
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
Welche Lanis-Apps sind an meiner Schule verfügbar?
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Stundenplan & Vertretung
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
Was steht heute im Vertretungsplan?
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
Zeig mir meinen Stundenplan für diese Woche.
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
In welchen Kursen bin ich eingeschrieben und wer sind meine Lehrkräfte?
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
Wer vertritt heute Herrn Müller in der 3. Stunde?
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Kalender
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
Welche Schultermine gibt es im April?
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
Zeig mir alle Termine zwischen dem 1. und 15. März.
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
Was sind die nächsten Schulveranstaltungen diesen Monat?
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Hausaufgaben & Aufgaben
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
Welche Hausaufgaben habe ich aktuell?
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
Gibt es Aufgaben mit Anhängen, die ich herunterladen kann?
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
Was muss ich für Mathematik vorbereiten?
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Nachrichten
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
Zeig mir meine letzten 5 Nachrichten.
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
Habe ich ungelesene Nachrichten?
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
Was hat die Schule zuletzt kommuniziert?
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Dateien
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
Was liegt im Schulischen Dateispeicher?
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
Gibt es neue verteilte Dateien oder Ankündigungen?
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## Ausgabeformate
|
|
275
|
+
|
|
276
|
+
Die meisten Tools unterstützen zwei Ausgabeformate:
|
|
277
|
+
|
|
278
|
+
- **`markdown`** (Standard): Für Menschen lesbar, ideal für die direkte Anzeige in der KI-Konversation
|
|
279
|
+
- **`json`**: Maschinenlesbar, nützlich wenn du die Daten weiterverarbeiten möchtest
|
|
280
|
+
|
|
281
|
+
Du kannst das Format in deiner Anfrage angeben:
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
Zeig mir den Vertretungsplan als JSON.
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
> **Hinweis:** Antworten sind auf **25.000 Zeichen** begrenzt. Bei sehr langen Ergebnissen wird die Ausgabe gekürzt und ein Hinweis angezeigt. Verwende in diesem Fall Filter (z. B. einen engeren Datumsbereich beim Kalender), um die Ergebnisse einzugrenzen.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Fehlerbehebung
|
|
292
|
+
|
|
293
|
+
### „Session abgelaufen" / Session expired
|
|
294
|
+
|
|
295
|
+
Der Session-Cookie ist abgelaufen (nur bei Modus 2 relevant). Der Server setzt die Verbindung automatisch zurück. Einfach die Anfrage erneut stellen – beim nächsten Versuch wird eine neue Session aufgebaut.
|
|
296
|
+
|
|
297
|
+
### „App nicht verfügbar an deiner Schule"
|
|
298
|
+
|
|
299
|
+
Nicht alle Schulen haben alle Lanis-Module aktiviert. Mit `get_available_apps` kannst du prüfen, welche der unterstützten Apps an deiner Schule freigeschaltet sind.
|
|
300
|
+
|
|
301
|
+
### Kein Vertretungsplan verfügbar
|
|
302
|
+
|
|
303
|
+
Der Vertretungsplan ist nur an Schultagen verfügbar. An Wochenenden und Feiertagen gibt es keinen Plan.
|
|
304
|
+
|
|
305
|
+
Manche Schulen zeigen die App „Vertretungsplan“ an, nutzen sie aber nicht. Dann meldet `get_substitution_plan`, dass keine Vertretungsdaten vorliegen.
|
|
306
|
+
|
|
307
|
+
### Keine Termine / Aufgaben gefunden
|
|
308
|
+
|
|
309
|
+
Prüfe, ob du den richtigen Zeitraum angegeben hast. Für den Kalender müssen `start` und `end` im Format `JJJJ-MM-TT` angegeben werden.
|
|
310
|
+
|
|
311
|
+
### Verbindungsfehler
|
|
312
|
+
|
|
313
|
+
Stelle sicher, dass die Umgebungsvariablen in der Claude Desktop Konfiguration korrekt gesetzt sind und dass du Zugang zum Schulportal Hessen hast (ggf. VPN oder Schulnetzwerk erforderlich).
|