Install
openclaw skills install @aikarjal/wilmaAccess Finland's Wilma school system from AI agents. Fetch schedules, homework, exams, grades, attendance/lesson notes (merkinnät), messages, news, and linked news resources via the wilma CLI. Start with wilma summary --json, drill into news with news read --json, and download any linked resource with news resource download.
openclaw skills install @aikarjal/wilmaWilma is the Finnish school information system used by schools and municipalities to share messages, news, exams, schedules, homework, and other student-related updates with parents/guardians.
Use the wilma / wilmai CLI in non-interactive mode to retrieve Wilma data for AI agents. Prefer --json outputs and avoid interactive prompts.
npm i -g @wilm-ai/wilma-cli
~/.config/wilmai/config.json.--json.wilma summary --student <id|name> --json
wilma summary --all-students --json
Returns today's and tomorrow's schedule, upcoming exams, recent homework, recent news, and recent messages in one call. This is the best starting point for any parent-facing summary.
wilma schedule list --when today --student <id|name> --json
wilma schedule list --when tomorrow --student <id|name> --json
wilma schedule list --when week --student <id|name> --json
wilma schedule list --date 2026-03-10 --student <id|name> --json
wilma schedule list --weekday thu --student <id|name> --json
--weekday also accepts Finnish short forms: ma, ti, ke, to, pe, la, su. Use --date or --weekday, not both.
wilma homework list --student <id|name> --json
wilma exams list --student <id|name> --json
wilma grades list --student <id|name> --json
wilma attendance list --student <id|name> --json
wilma attendance list --date 2026-03-10 --student <id|name> --json
wilma attendance list --all-students --json
Returns Wilma's per-lesson notes ("merkinnät") for a single day: positive feedback, behavioral remarks, missing materials, and absence categorizations (medical, explained, unexplained). Defaults to today if --date is omitted; teachers usually fill notes during or after class, so for a morning agent run prefer --date <yesterday>.
Each note has start/end times derived from Wilma's hour-grid headers — accurate to the lesson hour, with 45-minute period assumed. subject is the Wilma course code (e.g. MA_8LV = math, 8th grade), and typeLabel is the human-readable Finnish reason or remark.
wilma kids list --json
wilma news list --student <id|name> --json
wilma news read <id> --student <id|name> --json
wilma messages list --student <id|name> --folder inbox --json
wilma messages read <id> --student <id|name> --json
Always inspect the resources array returned by wilma news read <id> --json. Each resource has:
id — stable within the bulletin (resource-1, resource-2, …); the download command also accepts the bare number (1).label — the link text from the bulletin.url — absolute URL.authContext — "wilma": a download uses the authenticated Wilma session. "external": a download uses an isolated, unauthenticated fetch that never sends Wilma credentials (like opening the link in a signed-out browser).fileName — naming hint when the URL path looks like a file; may be null even for real files.Any resource can be attempted with the download command. There is no reliable way to know in advance whether a URL serves a file publicly, requires sign-in, or is a plain web page — so the CLI does not guess: it attempts the download and reports what actually happened. When a document is relevant to the user's request, attempt it:
wilma news resource download <news-id> <resource-id> --student <id|name> --output <directory> --json
Handle the returned status:
downloaded — the file was written. Use the returned absolute path, and trust contentType/sizeBytes over any guess from the bulletin label.not_a_file — every attempt answered with a web page instead of a file. This usually means the document requires signing in (for example a private SharePoint or OneDrive sharing link), or the link is simply a web page. Report this to the user; if access matters, open the url in a user-authorized browser session that has the external service's authentication. Never retry the download in a loop.error (exit code 1) — the attempt itself failed (HTTP error, network problem, size limit). Report the message.Keep downloads in a task-scoped directory via --output (defaults to the current working directory). Existing files are never overwritten — a numeric suffix is appended.
Prefer resource metadata over URLs embedded in content; content is prose and can be null for link-only bulletins.
All list commands support --all-students:
wilma summary --all-students --json
wilma homework list --all-students --json
wilma exams list --all-students --json
You can also pass a name fragment for --student (fuzzy match).
If the Wilma account has MFA/TOTP enabled:
Interactive setup (recommended): Run wilma interactively. When MFA is detected, choose "Save TOTP secret for automatic login" and paste your TOTP secret or otpauth:// URI. Future logins will auto-authenticate.
Non-interactive (one-off): Pass the TOTP secret directly:
wilma schedule list --totp-secret <base32-key> --student "Stella" --json
wilma schedule list --totp-secret 'otpauth://totp/...' --student "Stella" --json
If the TOTP secret has been saved via interactive setup, --totp-secret is not needed — the CLI auto-authenticates from the stored config.
--student is provided, the CLI uses the last selected student from ~/.config/wilmai/config.json (or $XDG_CONFIG_HOME/wilmai/config.json).--student is required for read commands.wilma interactively or use wilma config clear to reset.wilma update to update the CLI to the latest version.Wilma contains a mix of urgent items and general info. When summarizing for parents, prioritize actionable items:
Include items that:
De-prioritize items that:
When in doubt, include and let the parent decide. Prefer a short, structured summary with dates and IDs.
Use scripts/wilma-cli.sh for a stable wrapper around the CLI.