WilmAI

ai.wilmPublished by wilm.aiv2.4.0Updated Nov 7, 2026

Finland's Wilma school system for parents and students: schedule, homework, exams and messages.

VerifiedSTDIODesktop only

Overview

WilmAI's local MCP server, published by wilm.ai; no sign-in required; STDIO; 20 tools.

No AI overview yet: these facts come from the registry entry and the server itself.

Publisher
wilm.ai

Installation

In SourceWeft

  1. Open WilmAI in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

@wilm-ai/wilma-cli

Command line interface for Wilma (Finnish school system), built for parents and AI agents. Students can use it with their own Wilma login too.

Install

Needs Node.js 20.18.1 or newer.

bash
npm i -g @wilm-ai/wilma-cli# orpnpm add -g @wilm-ai/wilma-cli

Log in

bash
wilma login

Opens a one-time login page in your browser: pick your school's Wilma and log in. The login is saved to ~/.config/wilmai/config.json.

Without a browser: wilma login --tenant <url|city> --username <name> with the password in WILMA_PASSWORD or piped via --password-stdin. Or set WILMA_TENANT, WILMA_USERNAME, WILMA_PASSWORD (and WILMA_TOTP_SECRET) and skip the saved login.

Log out

bash
wilma logout                  # every saved login; `wilma logout 2` for one (numbers from `wilma accounts`)

Wilma allows one session per account: when WilmAI logs in, Wilma logs you out in your browser, and the other way round. wilma logout ends WilmAI's session, as Wilma's own Log out does, so you can use Wilma in the browser. The logins stay saved, and the next command logs in again. wilma config clear deletes the logins as well.

Use it

bash
wilma summary                 # the daily briefing for every child — start herewilma schedule tomorrow       # today | tomorrow | week | next-week | 2026-10-07 | thuwilma exams                   # upcoming exams, with topics and start timeswilma homeworkwilma notes --days 7          # lesson notes: absences and teachers' feedbackwilma notes summary           # those counted by kind for the school yearwilma messages                # newest first; [new] and reply countswilma messages 27164611       # one message with its whole threadwilma news                    # dated bulletins plus pinned ones; --older for the restwilma news 73291              # one bulletin with its linkswilma news 73291 download 1   # a file linked from itwilma grades                  # recent exam gradeswilma gradebook               # course and report-card gradeswilma printouts               # PDFs such as report cards; `wilma printouts <id>` saves onewilma studentswilma help <command>          # usage, examples and the JSON shape
  • Every child by default. --student <number|name> narrows to one (a number, the full name, or the start of a first or last name — never a loose match).
  • JSON for programs, text for people. Output is JSON when another program reads it (agents, pipes) and text in a terminal; --json or --text forces either. The JSON is the same as the MCP tools' — { students: [{ student, … }] } — compact, with times in Finnish time and their offset (2026-10-02T13:37:00+03:00).
  • Dates are YYYY-MM-DD, today, yesterday or tomorrow.
  • One login, not one per command. Commands continue the last Wilma session (saved next to the login, readable only by you) and log in again only when Wilma has ended it. Each login would otherwise log you out of Wilma in your browser and, with two-step verification, need a new code. WILMAI_NO_SESSION_CACHE=1 turns this off.
  • For daily runs: wilma summary --since yesterday returns only what is new: bulletins, messages, homework and lesson notes from that day on, plus anything unread.
  • Errors are JSON too: { "status": "error", "code": "unknown_student", "message": "…" }, with exit code 2 for usage errors, 3 when not logged in, and 1 otherwise. Codes include invalid_argument, unknown_command, not_logged_in, unknown_student, ambiguous_student, not_found, login_failed, mfa_required, network and wilma_error.

The 1.x spellings still work: kids list, tenants, attendance list, <command> list, messages read <id>, news read <id>, news resource download <id> <resource>, printouts download <id> and --all-students.

Running wilma without arguments in a terminal opens an interactive menu.

Use with AI assistants (MCP)

bash
wilma mcp

Starts a stdio MCP server with read-only Wilma tools (wilma_summary, wilma_schedule, wilma_read_news, …) that return the same data as the commands, plus wilma_logout, which ends WilmAI's Wilma session like wilma logout. Add it to any MCP client as npx -y @wilm-ai/wilma-cli@2 mcp. Setup guides for Claude, ChatGPT, Grok Bot and OpenClaw: https://wilm.ai

Bulletin attachments

wilma news <id> lists every link in a bulletin (resources). Any resource can be downloaded with wilma news <id> download <resource> [--output <directory>] (the resource id also accepts a bare number, e.g. 1 for resource-1). Wilma-hosted files download through the session; external links are fetched without your Wilma login, and only from public websites. The result's status says what happened: downloaded (use the returned path) or not_a_file when the link answered with a web page (for example a sharing link that needs signing in — open it in a browser instead). --output defaults to the current directory; existing files are never overwritten.

Several Wilmas

Children at schools on different Wilmas need one login per Wilma. Run wilma login again (or press "Add another school's Wilma" on the login page); commands then cover every child, and each child carries the wilma it belongs to.

bash
wilma accounts                     # saved logins, numberedwilma accounts remove <number>     # or the Wilma name or username; also ends that login's Wilma session

Find your Wilma

bash
wilma find-school <city or school>

Other

bash
wilma update                       # when a newer version is out, a command says so on stderr, at most once a day (WILMAI_NO_UPDATE_CHECK=1 turns it off)wilma config clear                 # deletes every saved login and sessionwilma home                         # where to download WilmAI Home, the Wilma app for Mac and Windowswilma --version

MFA (Multi-Factor Authentication)

If your Wilma account has MFA/TOTP enabled:

Recommended: run wilma login. When Wilma asks for a code, the login page asks for your authenticator's setup key (base32 or otpauth:// URI) and saves it with the login, so later logins make their own codes. In the interactive menu (wilma), choose "Save TOTP secret for automatic login".

Without a saved login: set WILMA_TOTP_SECRET along with the other WILMA_* variables. --totp-secret <key> also works, but a key on the command line ends up in shell history and is visible to other programs on the computer.

Config

Logins are saved in ~/.config/wilmai/config.json (or $XDG_CONFIG_HOME/wilmai/config.json; override with WILMAI_CONFIG_PATH) and the current Wilma sessions in wilmai-sessions.json next to it, both readable only by you. wilma logout ends the sessions and deletes them, keeping the logins; wilma config clear deletes both.

Troubleshooting: TLS errors on a managed laptop

A TLS certificate error means the network is intercepting TLS and re-signing with a private root CA (common behind a corporate secure web gateway). Node ignores the OS trust store, so curl and your browser keep working while every Wilma request fails. A successful npm install is not evidence that TLS is healthy — the npm registry is commonly exempt from inspection.

bash
NODE_USE_SYSTEM_CA=1 wilma summary                        # Node >=22.19 / >=24.6node --use-system-ca "$(command -v wilma)" summary        # Node >=22.15NODE_EXTRA_CA_CERTS=/path/to/root-ca.pem wilma summary    # explicit root

Never use NODE_TLS_REJECT_UNAUTHORIZED=0 — it turns verification off entirely.

In JSON, transport failures have the code network, with the underlying cause and a hint, so agents can branch on it:

json
{  "status": "error",  "code": "network",  "message": "TLS certificate verification failed for https://example.inschool.fi (UNABLE_TO_GET_ISSUER_CERT_LOCALLY)",  "cause": "UNABLE_TO_GET_ISSUER_CERT_LOCALLY",  "hint": "..."}

Notes

  • Credentials and TOTP secrets are stored with lightweight obfuscation (not encryption) in a file only your user can read.
  • Bulletin links are fetched only from public websites (never local or private network addresses), without your Wilma login.
  • Commands cover every child; --student <number|name> narrows to one.

Source: packages/wilma-cli/README.md at commit 44e4595

Tools

20

wilma_summary

School summary

Daily briefing 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 (ids, unread, replyCount; event invitations with invitationStatus, as in wilma_list_messages). What Wilma didn't give is listed in unavailable ("news": this Wilma doesn't show this account its bulletins). The best starting point for any question about school.

Parametersdayssincestudent

wilma_schedule

Lesson schedule

List each child's lessons for one day or a school week: today, the next school day, this or next week (Monday to Friday), a date, or the next given weekday; or any other week or period with from/to (e.g. a week further ahead, or several weeks to see the usual school days). Lessons come in time order with the date, start and end time, subject, teacher and room (when Wilma gives one); a day without school has no lessons. Exams and homework are in wilma_upcoming_exams and wilma_homework.

Parameterstodatefromwhenstudentweekday

wilma_homework

Homework

List the homework teachers have entered for each child, newest first: the date, subject, teacher and what to do. It reads the homework Wilma's front page lists (Wilma decides how far back that goes). wilma_summary already includes the last few days' homework.

Parameterslimitstudent

wilma_upcoming_exams

Upcoming exams

List each child's exams from today on that have no grade yet, soonest first: the date, start time (when the school gives one), exam name, subject, topic (what to study) and teacher. Graded exams are in wilma_grades.

Parameterslimitstudent

wilma_grades

Exam grades

List each child's graded exams, newest first: the date, exam name, subject, grade as Wilma shows it (e.g. 8+, 9½, S), the teacher's notes and when a guardian marked it seen. It reads the exams Wilma's front page lists (Wilma decides how far back that goes); with from, Wilma's list of past exams for that period instead, as far back as the school keeps them, including exams still waiting for a grade (grade: null). For course, term and report-card grades use wilma_gradebook.

Parameterstofromlimitstudent

wilma_lesson_notes

Lesson notes and absences

Lesson notes (merkinnät) teachers logged: absences, lateness, and feedback such as praise or missing books or homework, with the teacher's own words when given. One day (default today), the last N days, or a period with from/to, which can reach ahead (a teacher may note a make-up exam on a coming lesson).

Parameterstodatedaysfromstudent

wilma_lesson_notes_summary

Absences and feedback summary

Lesson notes counted by kind (e.g. absences for health reasons, unexplained absences, lateness, praise, missing study materials): this school year by default, or from a date.

Parameterstofromstudent

wilma_gradebook

Gradebook

Get each child's gradebook (Suoritukset): completed courses and their grades, grouped by subject (subject > syllabus > course), with course codes, credits and completion dates, plus term and school-year (report card) grades. Use it for course and report-card grades; single exam grades are in wilma_grades.

Parametersstudent

wilma_contacts

Class and teachers

Each child's class (e.g. 9A), class teacher and other supervisors with their role as Wilma names it (e.g. Luokanvalvoja), and the child's own teachers as Wilma's message recipients list them, with the subjects each teaches the child in this and next week's timetable (empty when none). Other school staff aren't included. Lessons with times and rooms are in wilma_schedule.

Parametersstudent

wilma_list_printouts

List printouts

PDF documents the school offers (Tulosteet), such as report cards or absence reports. Fetch one with wilma_get_printout.

Parametersstudent

wilma_get_printout

Get printout

Fetch one printout PDF so you can read it. Set save=true to also save it to the user's Downloads folder.

Parametersidrequiredsavestudent

wilma_list_messages

List messages

Wilma messages, newest first (subject, sender, date, id, unread, replyCount). The appointments folder holds event invitations (parents' evenings, learning discussions) with the family's answer as Wilma lists it: invitationStatus ("Applied": signed up, the time in invitationInfo; "ExpiredReg": sign-up closed; null: no answer shown). Use wilma_read_message for the full text, and for an invitation's time slots.

Parameterslimitfolderstudent

wilma_read_message

Read message

Full text of one Wilma message, including thread replies.

Parametersidrequiredstudent

wilma_list_news

List school news

School bulletins (tiedotteet): the newest dated ones, then pinned ones (pinned: true, e.g. the school-year bulletin), and with include_older also older bulletins (archived: true). Use wilma_read_news for the full text and attachments. unavailable: ["news"] means this Wilma doesn't show this account its bulletins, which isn't the same as having none.

Parameterslimitstudentinclude_older

wilma_read_news

Read news bulletin

Full text of one bulletin plus its linked resources (attachments and links). Fetch a resource with wilma_get_news_attachment.

Parametersidrequiredstudent

wilma_get_news_attachment

Get bulletin attachment

Fetch a file linked from a bulletin (e.g. a PDF letter or menu) so you can read it. Returns the file content when it is a file, or 'not_a_file' with the URL when the link is a web page. Set save=true to also save it to the user's Downloads folder.

Parameterssavenews_idrequiredstudentresource_idrequired

wilma_account

Wilma account status

Which Wilma logins are connected: each one's Wilma, username, role ("guardian", or "student" for a student's own login) and the children it lists. Families with children on different Wilmas connect one login per Wilma (wilma_login adds another). When two logins on one Wilma list the same child (a parent's and the child's own), tools read that child through the guardian's login, and the other login's entry for the child says readVia. A child unticked on the login page (a profile Wilma lists twice) has hidden: true and isn't read.

Takes no parameters.

wilma_find_school

Find a school's Wilma

Search Finland's Wilma addresses by city or by school or organisation name. Most city schools share their city's Wilma (big cities don't list each school), while many colleges, private schools and small municipalities' schools have their own. Use it to help the user pick their Wilma, e.g. when setting WILMA_TENANT; several can serve one city, so ask which is theirs.

Parametersqueryrequired

wilma_login

Log in to Wilma

Open a login page in the user's browser to connect a Wilma account, or add another one (for a child at a school with a different Wilma). The password is entered on that page, never in the chat.

Takes no parameters.

wilma_logout

Log out of Wilma

End WilmAI's Wilma session, as Wilma's own Log out does. Wilma allows one session per account, so use this when the user wants to use Wilma in their browser or asks to log out. The login stays saved: the next Wilma tool call logs in again, and that ends the user's session in the browser, so don't call other Wilma tools afterwards unless the user asks.

Takes no parameters.

Version history

1
  1. v2.4.0LatestNov 3, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts