π¦ ClawHub
Iserv
by @finnbusse
HTTP client for IServ school platforms. Log in to an IServ instance (e.g. https://grabbe-dt.de) and fetch common student data like unread mail counts, calendar events, files/folders, tasks/exercises, announcements/news, and other IServ modules via HTTP endpoints. Includes best-effort file ops + exercise submission.
TERMINAL
clawhub install iservπ About This Skill
name: iserv description: HTTP client for IServ school platforms. Log in to an IServ instance (e.g. https://grabbe-dt.de) and fetch common student data like unread mail counts, calendar events, files/folders, tasks/exercises, announcements/news, and other IServ modules via HTTP endpoints. Includes best-effort file ops + exercise submission.
IServ (school platform)
This skill uses an HTTP client (no browser automation) to log in and call IServ endpoints.
Credentials / security
Single profile:
ISERV_BASE_URL (e.g. https://grabbe-dt.de)ISERV_USERISERV_PASSMultiple profiles (parallel):
ISERV_PROFILE= or pass --profile ISERV__BASE_URL , ISERV__USER , ISERV__PASS Commands
cd skills/iserv/scriptsunread inbox count
./iserv.py mail-unreadlast 3 mails (IMAP)
./iserv.py mail-last --n 3upcoming calendar events (JSON)
./iserv.py calendar-upcominglist files (JSON)
./iserv.py files-list --path "/" # root
./iserv.py files-list --path "/Files" # typical user file areasearch files/folders recursively by substring
./iserv.py files-search --query "bio" --start-dir "/Files" --max-depth 6download a file (best-effort across IServ versions)
./iserv.py files-download --path "/Files/foo.pdf" --out-dir ./downloadsupload a file (prefers FS Dropzone-style chunked upload; falls back to legacy form upload)
./iserv.py files-upload --file ./foo.pdf --dest-dir "/Files"
optionally tune chunk size (bytes)
./iserv.py files-upload --file ./foo.pdf --dest-dir "/Files" --chunk-size 8388608create folder (best-effort; depends on IServ version)
./iserv.py files-mkdir --path "/Dokumente/Neu"rename/move (best-effort)
./iserv.py files-rename --src "/Dokumente/Alt.txt" --dest "/Dokumente/Neu.txt"delete (best-effort; USE WITH CARE)
./iserv.py files-delete --path "/Dokumente/Neu.txt"messenger: list chats / conversations
./iserv.py messenger-chatsmessenger: fetch messages for a chat
./iserv.py messenger-messages --chat-id messenger: send message
./iserv.py messenger-send --chat-id --text "Hello"list exercises (best-effort HTML scrape)
./iserv.py exercise-list --limit 50view one exercise + list attachments (optionally download them)
./iserv.py exercise-detail --id 123
./iserv.py exercise-detail --id 123 --download-dir ./downloadsattempt to submit an exercise file (best-effort; depends on IServ version)
./iserv.py exercise-submit --id 123 --file ./solution.pdf --comment "Abgabe"
Notes / next steps
on the exercise page and posts multipart), which is more robust than guessing an internal upload API.
If it still fails on a specific IServ instance, capture:
- the HTML of the exercise detail page (after login)
- response status + redirect URLIdeas to extend further:
Reference: IServ routes are discoverable via the bundled FOS routes JS (commonly /iserv/js/fos_js_routes.js; some instances also use /iserv/js/assets/fos_js_routes*.js).