aikarjal/wilmai/wilma
Claude Code and agent skill by aikarjal/wilmai
- community
Checking that the SKILL.md file is still in the repository.
Access Finland's Wilma school system from AI agents. Fetch schedules, homework, exams, grades and the gradebook, lesson notes (merkinnät) and absence summaries, messages with replies, news, printouts and linked news resources — through the WilmAI MCP tools (`wilma_*`) when connected, or the wilma CLI. Start with a summary, drill into messages and news, and fetch linked attachments. Requires wilma-cli 2.0+.
Install
npx vskill@latest install aikarjal/wilmai/wilmaSKILL.md
Wilma Skill
Overview
Wilma 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. Students can use WilmAI with their own login too; it then covers just that student.
There are two ways to reach Wilma. Both return the same data, in the same JSON shape.
- MCP tools — if tools named
wilma_*are available (the WilmAI connector, desktop extension or plugin), use them. No shell needed. - CLI — otherwise use the
wilma(orwilmai) command. It prints JSON when you run it (no--jsonneeded), andwilma help <command>shows usage, examples and the JSON shape.
Both cover every child by default; pass student / --student <number|name> to narrow to one. Results come per child: { students: [{ student: { studentNumber, name, wilma? }, … }] }. Times are Finnish time with their offset (2026-10-02T13:37:00+03:00) — report them as they are, without converting. When you write dates for the user, follow the language you answer in: Finnish ke 7.10. (with the final period), English Wed 7 Oct. Wilma's own texts use the Finnish style; convert it instead of mixing the two (not Wed 7.10).
| MCP tool | CLI command | ||||||
|---|---|---|---|---|---|---|---|
wilma_summary | wilma summary [--since <date>] | ||||||
wilma_schedule | `wilma schedule [today\ | tomorrow\ | week\ | next-week\ | <date>\ | <weekday>], wilma schedule --from <date> [--to <date>]` | |
wilma_homework | wilma homework | ||||||
wilma_upcoming_exams | wilma exams | ||||||
wilma_grades | wilma grades [--from <date> [--to <date>]] | ||||||
wilma_gradebook | wilma gradebook | ||||||
wilma_contacts | wilma contacts | ||||||
wilma_lesson_notes | `wilma notes [--date <date> \ | --days N \ | --from <date> [--to <date>]]` | ||||
wilma_lesson_notes_summary | wilma notes summary | ||||||
wilma_list_messages / wilma_read_message | wilma messages / wilma messages <id> | ||||||
wilma_list_news / wilma_read_news | wilma news / wilma news <id> | ||||||
wilma_get_news_attachment | wilma news <id> download <resource> | ||||||
wilma_list_printouts / wilma_get_printout | wilma printouts / wilma printouts <id> | ||||||
wilma_account | wilma students, wilma accounts | ||||||
wilma_find_school | wilma find-school <city> | ||||||
| — | wilma home (WilmAI Home, the desktop app: where to download it) | ||||||
wilma_login | wilma login | ||||||
wilma_logout | wilma logout |
Dates are YYYY-MM-DD, today, yesterday or tomorrow.
Logging in
The user logs in once; the login is saved on their computer.
- On the user's own computer: run
wilma login(or callwilma_login). It opens a page in the user's browser where they pick their school's Wilma and log in. Wait for the command to finish. - On a cloud computer the user can't see (no browser they can reach):
- Ask which city their children's school is in (or the school's name). Run
wilma find-school <city>(or callwilma_find_school) and let the user pick from the results — one city often has several Wilmas (city schools, private schools, colleges). - Ask the user to add
WILMA_USERNAMEandWILMA_PASSWORDto your secret or environment settings, plusWILMA_TOTP_SECRETif the account uses two-step verification, and setWILMA_TENANTto the Wilma address they picked. Every command then works without a saved login. Alternatively:wilma login --tenant <url> --username <name> --password-stdin.
- Don't run
wilmawithout arguments to look things up: in a terminal it opens a menu for people (from a program it prints the help). - Never ask the user to type their Wilma password into the chat.
- Children on different Wilmas (e.g. a city school and a private school): the user adds each login on the login page ("Add another school's Wilma") or with another
wilma login. All saved logins are used together; children then carry awilmafield naming their Wilma.wilma accountslists the logins, withrole: "student"for a student's own login. A child the user unticked on the login page (a profile Wilma lists twice) isn't read, andwilma accountslists it underhidden. When a parent's and a child's own login on the same Wilma are both saved, the child is read through the parent's (wilma-cli 2.4+).
Commands continue the last Wilma session instead of logging in each time (each login would log the parent out of Wilma in their own browser), so running several commands in a row is fine.
If the user wants to use Wilma in their browser, or asks you to log out, run wilma logout or call wilma_logout (wilma-cli 2.2+). It ends WilmAI's Wilma session and keeps the saved login. Don't run other Wilma commands after that unless the user asks: the next one logs in again, and that logs them out of Wilma in the browser.
Install
Core tasks
Daily briefing (start here)
Per child: today's and the next school day's lessons, upcoming exams (with start times when given), recent homework, lesson notes since the previous school day (teachers' feedback and absences), recent bulletins, and recent and unread messages (unread, replyCount). --since <date> keeps only what is from that day on — use it for scheduled daily runs. If Wilma couldn't give a part, unavailable names it.
Schedule
Default: this week. tomorrow is the next school day; a weekday (mon…sun, or Finnish ma…su) is its next occurrence. Lessons include the teacher(s) and, when Wilma gives one, the room. --from <date> reads any other week (to that week's Friday) or, with --to, a period of up to 31 days, e.g. a few weeks to see the usual school days (wilma-cli 2.4+).
Homework and exams
Each exam has its date, subject, name, topic (what to study) and teacher; time is the start time when the school gives one (otherwise null).
Grades
grades --from (wilma-cli 2.4+) reads Wilma's list of past exams for a period, as far back as the school keeps them; an exam still waiting for its grade has grade: null. The gradebook (Suoritukset) is a tree: subject → syllabus → course, each with grade, credits and completion date. Course codes ending in LV are usually school-year (report card) grades. An empty list means nothing has been graded yet.
Class and teachers
The child's class, class teacher and other supervisors (role as Wilma names it, e.g. Luokanvalvoja), and their own teachers with the subjects each teaches them in this and next week's timetable (wilma-cli 2.4+). Use it for "who is the class teacher" or "who teaches maths".
Lesson notes (merkinnät)
Teachers' per-lesson notes: positive feedback, behavioural remarks, missing books or homework, and absence categorisations (medical, explained, unexplained). One day (default today), --days N for the last N days, or --from/--to (--to can be ahead of today: a teacher may note a make-up exam on a coming lesson). Teachers usually fill notes during or after class, so for a morning run use the previous day (the summary already does). When the teacher wrote something, it's in note.
notes summary counts the notes by typeLabel for this school year (or --from/--to), e.g. how many lessons were missed for health reasons.
Each note has start/end times from Wilma's hour grid (accurate to the lesson hour). subject is the course code (e.g. MA_8LV = math, 8th grade; empty when the note isn't about a lesson) and typeLabel is Wilma's Finnish label.
Messages and bulletins
Message lists mark unread messages and replyCount; wilma messages <id> returns the thread with its replies. The appointments folder holds event invitations (parents' evenings, learning discussions) with the family's answer as Wilma lists it (wilma-cli 2.4+): invitationStatus "Applied" (signed up, the time in invitationInfo), "ExpiredReg" (sign-up closed), or null; reading the invitation gives its time slots. The summary's invitations carry the same fields. wilma news returns the newest dated bulletins plus every pinned one (pinned: true, e.g. the school-year bulletin); --older adds older bulletins (archived: true, dated once read). Reading an item needs no --student unless several Wilmas are connected.
Printouts
PDF documents the school offers, such as report cards or absence reports (it varies by school).
Bulletin attachments
Always inspect the resources array returned by wilma news <id>. 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 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. 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:
Handle the returned status:
downloaded— the file was written. Use the returned absolutepath, and trustcontentType/sizeBytesover any guess from the bulletin label.not_a_file— the link answered with a web page instead of a file. This usually means the document requires signing in (for example a private cloud-drive sharing link), or the link is simply a web page. Report this to the user; if access matters, open theurlin a user-authorized browser session that has the external service's authentication. Never retry the download in a loop.- An error (see below) — 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.
With the MCP tools, wilma_get_news_attachment returns the file itself (text inline, images as images, other files such as PDFs as an embedded file) plus the same not_a_file handling. Pass save: true to also save a copy to the user's Downloads/WilmAI folder.
Choosing a child
--student takes a student number, the full name, or the start of a first or last name (Kiia for "Kiia Example"). An unknown or ambiguous name is an error (unknown_student / ambiguous_student) that lists the children, so pass a number or full name from wilma students when unsure.
Errors
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/wilma/SKILL.md
Popularity
- Repository stars
- 71
- Repository forks
- 12
- 7-day trend score
- 21
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 25 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/aikarjal/wilmai/wilma)