Skolemelding MCP
Summary: Read Skoleplattform Oslo school messages and attachments locally via MCP, without replying or changing read status.
List received messages with previews, unread state, and attachment names; schema supports a limit up to 100, while README also documents search, unread/questions/absence filters, and child filtering.
Read full message text and replies, optionally original HTML; find older messages by ID by scanning up to 1,500 inbox entries.
Download and save attachments, returning path/name/type/size, optionally including content as base64/images/embedded resources; schema caps attachments at 10 MB.
List children and filter messages by child per README, though this tool is absent from the provided schema.
Cannot send replies, mark messages read, answer yes/no questions, or confirm read receipts; use the Skolemelding app for those.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Skolemelding MCP list my latest Skolemelding messages"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Skolemelding MCP
English · Norsk
Read Skoleplattform Oslo messages and attachments through a local MCP server. Its four tools list your children, list messages, read a message, and download an attachment. They do not send replies or mark messages as read.
This is a simple local version that runs on your own computer. list_messages shows at most 100 messages. It can search for words in the messages and list only unread messages, messages with a yes/no question, or absence messages; there is no date-range search yet. If you know a message ID, get_message can also find older messages by scanning up to 1,500 inbox entries. There is no fixed date cutoff in this code, but how far back it can reach depends on the Skolemelding service and how many newer messages you have.
When the school asks for a yes/no answer, the message includes question with the question text. When it asks parents to confirm that they have read it, the message includes readConfirmationRequested. The MCP cannot answer either one; use the Skolemelding app for that.
Each message lists the children it is about. If you have more than one child at an Oslo school, list_children shows their names, and list_messages takes a child (first name or full name) to list only that child's messages. This has only been tested on an account with one child; see issue #10 if you can help test it with several.
At some Oslo schools, email notifications no longer include message contents or attachments. This MCP makes it easier to retrieve them from Skolemelding and use them in an agent workflow. You are responsible for deciding whether to share school information with ChatGPT or other cloud-based or commercial AI services.
Example: put a school event on a calendar
An email notification titled “Ny Skolemelding” says a new school message is available, but does not include its contents. An assistant can use this MCP to find and read the message, then download any attachments that contain event details (with include_content: true if the client cannot read local files).
For example, a message says there will be a maths assessment on Tuesday morning and asks pupils to eat breakfast and arrive on time. The assistant can add an all-day calendar event for Tuesday with those instructions in the description. It should not invent a start time, and it should check for an existing event before creating one. If the Skolemelding session has expired, the assistant can ask the user to refresh it with npm run login and retry afterward.
Related MCP server: @injaan.dev/ms365-email-cli-mcp
Install
Install Node.js 20 or later and Google Chrome. In Terminal, open this project folder and run:
npm install
npm run loginComplete the ID-porten sign-in in Chrome. Run npm test to check the server without using your account.
Add to an AI client
Add the server to your client as a local (stdio) MCP server. Use node as the command (the full path from command -v node if the client cannot find it) and the full path to this project's src/server.js as the only argument. See the setup guide for Claude Desktop, ChatGPT or Grok Build. AI clients in a web browser cannot use a local server.
Attachments and configuration
get_attachment saves the file in .data/attachments/ and returns its path, name, type, and size. The tool result only contains the file itself when the tool is called with include_content: true; images are then returned as images and other files as embedded resources. Clients that cannot read local files, such as the ChatGPT desktop app or Claude Desktop, need include_content: true to see what an attachment says. Clients that can read local files can open the saved file without it.
Files that are not common documents, images, audio, video or ZIP archives are saved with .download added to the name, so they are not opened or run by mistake. On macOS and Windows, saved attachments are also marked as downloaded from the internet, so the system warns before opening them.
get_message returns the message and its replies as plain text; add include_html: true to also get the original HTML. Messages are reused for up to five minutes, so unread can lag behind after you read a message in the app.
Version 0.3.0 changed these defaults. Earlier versions always returned attachments as base64 and messages with bodyHtml.
To change the defaults, set these environment variables in the MCP client settings (and in Terminal for npm run login):
Variable | Default | Purpose |
|
| Sign-in file and saved attachments |
|
| Saved sign-in |
|
| Where |
|
| Browser used for sign-in |
|
| Playwright installation to use |
|
| App version sent to Skolemelding |
| Values from the official app | Sign-in client IDs |
The sign-in imitates the official Skolemelding Foresatte app. If Skolemelding starts rejecting sign-ins or refreshes after an app update, set SKOLEMELDING_APP_VERSION to the version in the current app store listing and run npm run login again.
Security and privacy
This MCP runs locally and does not open a network port. An AI client you connect can still retrieve school messages and attachments from your account. Content used with a cloud AI service may be sent to that service. Messages may also contain text intended to influence the agent. The MCP removes invisible characters and text hidden in the message HTML, and its tool descriptions tell the client to treat message text as information, not instructions, but this cannot stop every attempt. Use clients you trust, review tool calls, and never share the sign-in files in .data/. Saved attachments stay in the attachment folder until you delete them. Attachment paths returned to the AI client include your user name on this computer.
Signing in registers this computer as a device on your Skolemelding account, the same way the mobile app does. It sends the operating system name and kernel version (for example darwin|25.6.0), the app version, and a random device ID created at sign-in.
npm run login uses a new, empty browser profile and deletes it when sign-in is finished, so no ID-porten session or saved password is left behind. Versions before 0.5.1 kept a browser profile in .data/mobile-browser-profile/; you can delete that folder.
The integration uses undocumented Skolemelding endpoints that may change. If your session expires, run npm run login again.
Changelog
0.5.1
npm run loginno longer keeps a browser profile;SKOLEMELDING_MOBILE_PROFILEis removed. You can delete an old.data/mobile-browser-profile/folder.Invisible characters and hidden text are removed from message text, and the tool descriptions say message text is information, not instructions.
Attachments of unusual types are saved with
.downloadadded, and saved attachments are marked as downloaded on macOS and Windows.Messages no longer include
recipients.Only one inbox scan runs at a time, and a scan stops after 90 seconds. Error messages no longer show local file paths.
Sign-in requests no longer follow redirects, one malformed message can no longer break
list_messagesorget_message, and a refused attachment gives a clearer error. See #12.unread_onlyno longer lists chats that Skolemelding marks as read. The setup example is replaced by links to each client's guide.
0.5.0
list_messagestakessearch,unread_only,questions_onlyandabsence_only. Skolemelding does the searching and filtering.Messages show the school's yes/no question (
question) and whether it asks parents to confirm they have read the message (readConfirmationRequested).
0.4.0 (2026-11-09)
New
list_childrentool, plus achildfilter onlist_messages.Each message shows which children it is about.
recipientsis left out when it is empty.
0.3.0 (2026-11-09)
get_attachmentsaves the file locally and returns its path. The file itself is only returned withinclude_content: true.get_messagereturns plain text, also for replies. The HTML is only returned withinclude_html: true.The server handles several requests at once, and messages are cached for five minutes.
The app version and client IDs can be set with environment variables.
Tests run automatically on GitHub for every change.
0.2.0 (2026-10-06)
First public version:
list_messages,get_messageandget_attachment.
License
The code and documentation use the 0BSD license: free for anyone to use, change, and share for any purpose, including commercial use, without attribution. The license does not cover the Skolemelding service or its data.
To publish, use Git and check git status --short before committing. .gitignore excludes local sign-ins, research files, installed packages, and ZIP archives. Do not upload the whole folder manually.
Available Tools
3 toolsget_attachmentB
Get base64 bytes of a message attachment (maximum 10 MB).
Inputs: attachment_id (required).
get_messageB
Read full text and attachment metadata, including for unread messages, without changing their read status.
Inputs: id (required).
list_messagesB
List received Skolemelding messages with previews, unread state, and attachment names.
Inputs: limit.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: list_messages returns previews, get_message returns full text and attachment metadata, and get_attachment returns raw bytes. The boundaries between reading a message and fetching its attachment are clear and unlikely to be confused.
All three tools follow a consistent verb_noun snake_case pattern: list_messages, get_message, get_attachment. The naming is predictable and easy to parse.
Three tools is a reasonable minimum for a read-only message client, and each earns its place. However, it is on the low end, and a slightly larger surface for common read workflows could be expected.
The surface covers listing, reading, and downloading attachments, but it lacks any operation to mark messages as read, send/reply, or delete. For a messaging domain, these are notable missing operations that create dead ends for common workflows.
Maintenance
Related MCP Connectors
Your IMAP mailbox as an MCP server: read, search and (if you allow it) organize mail. Open source.
Your mailbox for MCP clients: search, read, draft, send, rules and notes. Sending is off by default.
Your own WhatsApp as an MCP server: read, search and send from any MCP client.
MCP server for MailTempo's public free temporary email inboxes.
Related MCP Servers
- FlicenseAqualityDmaintenanceA lightweight MCP server for personal Microsoft Outlook/Hotmail accounts, enabling email search, reading, attachment management, and folder operations via Microsoft Graph API with OAuth device-code flow.61-
- AlicenseAqualityDmaintenanceDeprecated MCP server wrapper for ms365-email-cli that exposes Microsoft 365 email operations (list, read, send, reply, search, etc.) as MCP tools. Use the main ms365-email-cli package instead, which now includes built-in MCP server support.1021 npmISC
- AlicenseNot gradedqualityDmaintenanceAn MCP server that reads, searches, organizes, and deletes Proton Mail through the local Proton Mail Bridge, with read-only mode and sender authentication checks. It cannot send mail.105 npmMIT
- AlicenseNot gradedqualityDmaintenanceMCP server that exposes a Microsoft 365 mailbox via the Model Context Protocol, enabling AI assistants to search, read, and download emails and attachments, and optionally send mail.8 npmMIT