Wilma MCP Server
Wilma MCP Server
Ein MCP (Model Context Protocol)-Server für Wilma – die finnische Schulkommunikationsplattform von Visma. Er ermöglicht Claude und anderen MCP-kompatiblen KI-Assistenten die Interaktion mit Schuldaten, einschließlich Stundenplänen, Nachrichten und mehr.
Funktionen
Stundenplan – Tägliche oder wöchentliche Stundenpläne mit Fächern, Zeiten und Lehrkräften anzeigen
Nachrichten – Posteingangsnachrichten mit gelesen/ungelesen-Status abrufen, vollständigen Inhalt anzeigen, als gelesen markieren
Empfänger – Verfügbare Nachrichtenempfänger auflisten (Lehrkräfte, Personal)
Nachrichten senden – Nachrichten an Lehrkräfte verfassen und senden
Related MCP server: Dnevnik.ru MCP Server
Voraussetzungen
Python 3.11 oder höher
Ein Wilma-Konto (Schüler, Erziehungsberechtigter oder Lehrkraft)
Die Wilma-URL Ihrer Schule (z. B.
https://yourschool.inschool.fi)
Installation
# Clone the repository
git clone https://github.com/jessemc98/wilma-mcp.git
cd wilma-mcp
# Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install the package
pip install -e .Konfiguration
Erstellen Sie eine .env-Datei mit Ihren Wilma-Anmeldedaten:
cp .env.example .envBearbeiten Sie .env:
WILMA_BASE_URL=https://yourschool.inschool.fi
WILMA_USERNAME=your_username
WILMA_PASSWORD=your_passwordSicherheitshinweis: Committen Sie Ihre
.env-Datei niemals in die Versionskontrolle.
Verwendung mit OpenClaw
Wenn Sie OpenClaw verwenden, enthält dieses Projekt eine SKILL.md, die Ihrem Agenten automatisch beibringt, wie er die Wilma MCP-Tools verwendet.
Führen Sie die obigen Schritte Installation und Konfiguration aus.
Fügen Sie den MCP-Server zu Ihren Claude Code-Einstellungen hinzu (
~/.claude.jsonoder Projekt-.mcp.json):
{
"mcpServers": {
"wilma": {
"command": "/path/to/wilma-mcp/venv/bin/python",
"args": ["-m", "wilma_mcp.server"],
"cwd": "/path/to/wilma-mcp"
}
}
}Platzieren oder verlinken Sie die
SKILL.mdin Ihrem OpenClaw-Skills-Verzeichnis, damit der Agent sie finden kann.
Verwendung mit Claude Desktop
Fügen Sie den Server zu Ihrer Claude Desktop-Konfigurationsdatei hinzu:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"wilma": {
"command": "/path/to/wilma-mcp/venv/bin/python",
"args": ["-m", "wilma_mcp.server"],
"cwd": "/path/to/wilma-mcp"
}
}
}Starten Sie Claude Desktop nach der Aktualisierung der Konfiguration neu.
Verfügbare Tools
get_schedule
Ruft den Schulstundenplan für ein bestimmtes Datum ab.
Parameter:
date_str(optional): Datum, für das der Stundenplan abgerufen werden soll. Standardmäßig "today".Unterstützt: "today", "tomorrow", "yesterday"
Wochentagsnamen: "monday", "tuesday", usw. (Englisch oder Finnisch)
Datumsformate: "2024-03-15", "15.3.2024"
Beispiel: "Wie sieht mein Stundenplan für Montag aus?"
get_week_schedule
Ruft den Stundenplan für eine ganze Woche ab.
Parameter:
start_date(optional): Startdatum der Woche. Standardmäßig heute.
Beispiel: "Zeig mir den Stundenplan für nächste Woche"
get_messages
Ruft eine Liste der Nachrichten aus dem Posteingang ab. Jede Nachricht zeigt einen gelesen/ungelesen-Indikator (📖 gelesen, 📬 ungelesen).
Parameter:
folder(optional): Ordnername – "inbox", "sent", "archive" oder "drafts". Standardmäßig "inbox".limit(optional): Maximale Anzahl zurückzugebender Nachrichten. Standardmäßig 20.
Bei "sent" und "drafts" zeigt die Auflistung den Empfänger ("An:") anstelle des Absenders.
Beispiel: "Überprüfe meine Nachrichten" / "Zeig mir meine gesendeten Nachrichten"
get_message
Liest eine bestimmte Nachricht mit vollständigem Inhalt. Hinweis: Das Anzeigen einer Nachricht markiert sie automatisch als gelesen auf dem Wilma-Server.
Parameter:
message_id: Die ID der zu lesenden Nachricht.
Beispiel: "Lies Nachricht 12345"
set_message_read
Markiert eine Nachricht explizit als gelesen. Nützlich, um Nachrichten als gelesen zu markieren, ohne ihren vollständigen Inhalt zu lesen. Wilma unterstützt das Markieren von Nachrichten als ungelesen nicht – dies ist eine Plattformbeschränkung.
Parameter:
message_id: Die ID der als gelesen zu markierenden Nachricht.
Beispiel: "Markiere Nachricht 12345 als gelesen"
get_recipients
Ruft eine Liste der verfügbaren Nachrichtenempfänger ab (Lehrkräfte, Personal, Erziehungsberechtigte).
Parameter:
query(optional): Groß-/Kleinschreibung-unabhängiger Namensfilter (z. B. der Nachname einer Lehrkraft). Praktisch, da die vollständige Empfängerliste einer Schule lang sein kann.
Jeder zurückgegebene Empfänger hat eine id-Zeichenfolge (z. B. r_guardian=11876_2893&n_class=33), die Sie direkt an send_message übergeben können.
Beispiel: "Wem kann ich Nachrichten senden?" / "Finde den Empfänger für Herrn Schmidt"
send_message
Sendet eine neue Nachricht an einen beliebigen Empfänger (Lehrkraft, Mitarbeiter oder Erziehungsberechtigten).
Parameter:
recipient: An wen gesendet werden soll – entweder der Name einer Person (z. B."Galiana Fatima", wird automatisch gegen die Empfängerliste aufgelöst) oder eine Empfänger-id vonget_recipients(z. B."r_guardian=11876_2893&n_class=33"). Um mehrere Personen zu adressieren, verbinden Sie ihre IDs mit&.subject: Nachrichtenbetreffbody: Nachrichtentext/-inhalt
Wenn ein Name mit mehr als einer Person übereinstimmt, gibt das Tool die Liste der Übereinstimmungen zurück, damit Sie eine bestimmte ID auswählen können (es wird nicht geraten).
Beispiel: "Sende eine Nachricht an Herrn Schmidt bezüglich der Hausaufgaben"
Um auf eine vorhandene Nachricht zu antworten, verwenden Sie stattdessen
reply_to_message– es löst den Empfänger automatisch aus der ursprünglichen Nachricht auf.
reply_to_message
Antwortet auf eine vorhandene Nachricht. Dies ist die bevorzugte Methode zum Antworten, da sie die Empfängerauflösung automatisch über das Wilma-Antwortformular handhabt, ohne dass Empfänger-IDs nachgeschlagen werden müssen.
Parameter:
message_id: ID der Nachricht, auf die geantwortet werden soll (vonget_messages)body: Antwortnachrichtentext/-inhalt
Beispiel: "Antworte auf Nachricht 12345, dass ich teilnehmen werde"
Beispielunterhaltungen
Nach der Konfiguration können Sie Claude fragen:
"Wie sieht mein Stundenplan für heute aus?"
"Habe ich am Freitag Unterricht?"
"Zeig mir meine ungelesenen Nachrichten"
"Lies die Nachricht von meiner Lehrkraft"
"Um wie viel Uhr beginnt die Schule morgen?"
Technische Hinweise
Wilma hat keine offizielle öffentliche API. Dieser Server rekonstruiert die Webschnittstelle.
Die Authentifizierung verwendet Sitzungscookies, die über den Anmeldevorgang erhalten werden.
Stundenplandaten werden aus eingebettetem JavaScript auf der Stundenplanseite extrahiert.
Nachrichtenlisten verwenden JSON-Endpunkte pro Ordner (
/messages/listfür den Posteingang,/messages/list/outboxfür gesendet,/messages/list/archive,/messages/list/drafts); einzelne Nachrichten erfordern HTML-Parsing.Gelesen/ungelesen-Verfolgung: Wilmas JSON-API enthält ein
Status-Feld pro Nachricht – truthy bedeutet ungelesen, falsy/abwesend bedeutet gelesen. Das Anzeigen einer Nachricht (GET-Anfrage) markiert sie serverseitig als gelesen. Es gibt keine API, um eine Nachricht als ungelesen zu markieren.Nachrichten senden: Wilma stellt Empfänger nicht als
<option>-Elemente dar. Der Empfängerauswähler (/messages/recipients) bettet jede erreichbare Person als.recipient-blockein, dessendata-source-Link einen Selektor der Formr_<type>=<id>kodiert (z. B.r_guardian,r_personnel,r_ownteachers). Zum Verfassen führt der Server ein GET auf/messages/compose?<selector>aus (das das Formular mit einem neuenformkeyund dem Empfänger, der als versteckter_<type>-Eingabe vorausgefüllt ist, zurückgibt), füllt die FelderSubjectundBodyTextaus und sendet ein POST mit demaddsavebtn"Senden"-Button. Deshalb funktionieren jetzt neue Nachrichten, nicht nur Antworten.Der Server muss möglicherweise aktualisiert werden, wenn sich die Webschnittstelle von Wilma ändert.
Entwicklung
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytestZukünftige Funktionen (Geplant)
Noten und Bewertungen
Fehlzeiten/Anwesenheitsaufzeichnungen
Bevorstehende Prüfungen
Schulnachrichten/Ankündigungen
Kurslisten
Lizenz
MIT-Lizenz – siehe LICENSE-Datei.
Haftungsausschluss
Dies ist ein inoffizielles Projekt und steht in keiner Verbindung zu Visma und wird von Visma nicht unterstützt. Nutzung auf eigene Gefahr. Bitte respektieren Sie die Nutzungsbedingungen und Ratenbegrenzungen von Wilma.
Mitwirken
Beiträge sind willkommen! Bitte zögern Sie nicht, einen Pull Request einzureichen.
Available Tools
8 toolsget_messageA
Read a specific message with full content.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The ID of the message to read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must convey behavioral traits. 'Read' implies a non-destructive operation, and 'full content' indicates the return value. However, it does not clarify whether reading affects read status (despite a sibling 'set_message_read'), nor does it mention error handling or authentication requirements. The description provides basic transparency but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise sentence, front-loaded with the action and resource, with no superfluous words. It efficiently communicates the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and an existing output schema, the description is sufficiently complete. It clarifies the scope ('specific message') and the nature of the result ('full content'), which is adequate for an AI agent to understand when and how to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes the single parameter 'message_id' with full coverage. The description adds no extra meaning beyond the schema, just reiterating 'specific message' which corresponds to the parameter. With 100% schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: reading a specific message with full content. It uses a specific verb ('read') and resource ('specific message'), and effectively distinguishes from the sibling tool 'get_messages' by emphasizing singularity ('specific') and completeness ('full content').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by saying 'specific message' which contrasts with 'get_messages', but it does not explicitly state when to use this tool over alternatives, nor does it mention any exclusions or prerequisites. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesA
Get list of messages from a folder.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of messages to return (default 20) | |
| folder | No | Folder to read from. Options: "inbox", "sent", "archive" | inbox |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. 'Get list' clearly signals a read-only operation, but it does not disclose ordering, pagination behavior, folder validation, or whether full message content is returned. It is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. Every word contributes to the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: two fully described parameters and an output schema exist. The description provides the minimal core behavior, and the schema covers parameter details. It does not mention alternatives, but that gap is already captured in usage guidelines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the parameters. The description's phrase 'from a folder' echoes the schema's folder parameter without adding deeper meaning about limit behavior or folder selection semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('list of messages') with a clear scope ('from a folder'). The plural 'list' distinguishes it from the sibling tool 'get_message'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives like get_message, send_message, or set_message_read. It does not mention exclusions or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recipientsA
Get list of available message recipients (teachers, staff).
Returns: List of recipients with their IDs and roles.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly indicates a read-only list operation via 'Get list' and discloses the return format ('List of recipients with their IDs and roles'). The qualifier 'available' adds useful scope. It does not mention permissions or rate limits, but for a simple getter this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the main purpose and immediately followed by the return format. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and a simple return structure, the description is complete. It explicitly mentions the fields returned (IDs and roles) and qualifies the recipients as 'available'. No significant gaps exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the input schema is fully self-explanatory. The description adds no parameter semantics, but none are needed. The baseline for no parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get list of available message recipients (teachers, staff)'. It uses a specific verb ('Get') and a specific resource ('recipients'), and the scope is clarified with the parenthetical. This distinguishes it from sibling tools like get_messages or send_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage in the context of messaging by referring to 'message recipients', but it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions. Sibling tool names suggest its role among messaging tools, but direct guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduleA
Get the school schedule for a specific date.
| Name | Required | Description | Default |
|---|---|---|---|
| date_str | No | Date to get schedule for. Supports: - "today", "tomorrow", "yesterday" - Weekday names: "monday", "tuesday", etc. - Date formats: "2024-03-15", "15.3.2024", "15.3." | today |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Get' implies a read operation, but it does not disclose behavior for invalid dates, timezone handling, or other edge cases. The description is adequate but lacks deeper behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no superfluous words. Every word carries meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with an output schema and clear schema documentation, the description is nearly complete. It lacks explicit sibling differentiation, but the 'specific date' phrasing sufficiently covers the main use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with a detailed description of the single parameter including supported formats and default. The tool description adds no further parameter information, hitting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'school schedule' for a 'specific date', which distinguishes it from the sibling tool get_week_schedule. It is concise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'specific date' implies this is for a single day, implicitly contrasting with get_week_schedule. However, it does not explicitly state when to use this tool over alternatives or mention any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_week_scheduleA
Get the school schedule for a full week.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | No | Start date of the week. Defaults to today. | today |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It only says 'Get the school schedule' without stating that it is read-only, any authentication requirements, or how the week is calculated. This leaves important behavioral context unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the main action and resource. There is no unnecessary information or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has low complexity with one well-documented parameter and an output schema, so the description does not need to explain return values. However, it could be slightly more explicit about the exact definition of 'full week' (e.g., starting day, inclusion of weekends), which keeps it from a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage for the single parameter 'start_date' with a clear description. The tool description adds no additional parameter meaning beyond what is in the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get the school schedule for a full week.' It uses a specific verb ('get'), a resource ('school schedule'), and a clear scope ('full week'), which distinguishes it from the sibling tool 'get_schedule' that likely handles a different time range.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this tool is for a full week schedule, implying it is appropriate when the user needs a weekly view. However, it does not explicitly mention alternatives or when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_messageA
Reply to a message. This is the preferred way to reply to messages since it handles recipient resolution automatically via Wilma's reply form, without needing to look up recipient IDs separately.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Reply message body/content | |
| message_id | Yes | ID of the message to reply to (from get_messages) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions the automatic recipient resolution behavior but does not disclose side effects, permissions, or whether sending the reply affects read state. For a mutation tool, this lack of detail is a gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no waste. The opening phrase clearly states the action, and the second sentence provides meaningful context about the tool's advantage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two params and an output schema, the description is fairly complete. It explains the core behavior and key benefit. It could note potential side effects like marking the original message as read, but overall it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters fully. The description adds no extra parameter semantics beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Reply to a message' with a specific verb and resource. It also distinguishes itself from sibling tools like send_message and get_recipients by emphasizing automatic recipient resolution via Wilma's reply form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says this is the 'preferred way to reply' and explains why (automated recipient resolution). It implies when to use this tool over alternatives, though it does not explicitly state when not to use it or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageC
Send a message to a teacher or staff member.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Message body/content | |
| subject | Yes | Message subject | |
| reply_to_id | No | Optional message ID if this is a reply | |
| recipient_id | Yes | ID of the recipient (use get_recipients to find IDs) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavioral traits. It says only 'Send a message' with no information about side effects, permission requirements, delivery guarantees, error behavior, or any constraints. This is a complete lack of behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no filler. It is appropriately concise for a simple tool and effectively front-loaded with the verb. Every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of closely related sibling tools ('reply_to_message', 'get_recipients') and the schema, the description is too sparse to provide a complete picture. It lacks usage context and behavioral details, though the output schema does cover return value expectations, slightly reducing the burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds no additional parameter context beyond the schema, keeping it at the baseline score. It does not clarify how 'reply_to_id' might relate to the sibling 'reply_to_message' tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Send' with a clear resource 'message' and an audience ('a teacher or staff member'), making the basic purpose apparent. However, it does not explicitly distinguish from the sibling tool 'reply_to_message', which could also be seen as sending a message, so full sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives like 'reply_to_message'. It only states the action without contextual cues about when this is the appropriate choice, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_message_readA
Mark a message as read.
Wilma automatically marks messages as read when viewed. This tool explicitly triggers that by viewing the message. Note: Wilma does not support marking messages as unread.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The ID of the message to mark as read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the tool works by viewing the message, which is a mechanism detail. Critically, it states that unread is not supported — a significant behavioral limitation. It doesn't mention potential side effects (e.g., idempotency, permissions), but for a simple mutation this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences plus a note. Every sentence has purpose — the first states the action, the second explains the mechanism, and the note addresses a key limitation. The structure front-loads the purpose immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a single parameter, an output schema, and a clear description, this is complete. It covers the action, the mechanism, and the unread limitation. No additional context is needed for an AI agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no extra parameter details beyond what the schema already provides (message_id). It doesn't explain IDs, formats, or how they relate to the viewing action, but that's unnecessary given the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb+resource construction: "Mark a message as read." It clearly distinguishes itself from sibling tools like get_message and get_messages by emphasizing that it explicitly triggers the read state rather than simply retrieving content. The distinction is meaningful because Wilma auto-marks messages as read when viewed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clarifies when to use the tool: to explicitly trigger a read state without needing to read the message content. It also notes that Wilma does not support unread, which is an exclusion. However, it doesn't explicitly name alternatives (e.g., get_message) or explain why you'd choose this over them, so guidance is implied rather than fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
get_message - First observed
get_messages - First observed
get_recipients - First observed
get_schedule - First observed
get_week_schedule - First observed
reply_to_message - First observed
send_message - First observed
set_message_read
TDQS
Scored across 8 tools
Most tools are clearly distinct: schedule vs message tools, single vs list retrieval. However, get_message and set_message_read overlap since viewing a message marks it as read, potentially confusing agents. send_message and reply_to_message are also somewhat related but the reply tool has a clear differentiator.
Tool names follow a consistent verb_noun pattern with clear prefixes: get_ for read operations, set_ for state change, send_ and reply_ for message creation. All names are lowercase with underscores and readable.
8 tools is an appropriate size for a school communication platform covering schedules and messaging. Each tool earns its place, and the count is within the typical 3-15 range without feeling bloated or sparse.
The messaging domain covers core operations: list, get, send, reply, mark read, and recipient lookup. Schedule domain provides get by day and week. Minor gaps exist like message deletion or archiving, but these are not essential for the stated purpose.
Maintenance
Related MCP Connectors
An MCP server that integrates with Discord to provide AI-powered features.
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
MCP server for AI dialogue using various LLM models via AceDataCloud
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to access and interact with Google Classroom data, allowing users to view courses, course details, and assignments through natural language commands.600 npm6MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that integrates with the Dnevnik.ru API to provide AI assistants with access to school schedules, grades, and homework. It enables users to query educational data and manage school-related information through natural language.2MIT
- AlicenseBqualityDmaintenanceAn MCP server that integrates with the OpenClaw API to enable AI assistants to send messages across multiple platforms, execute system commands, and manage calendar events and emails.51MIT
- AlicenseAqualityDmaintenanceAn MCP server for accessing Dutch school schedules from Magister. Enables Claude and other MCP-compatible AI assistants to query school schedules, drop-off times, and pick-up times.413 npm4MIT