Skip to main content
Glama
jmccrosky
by jmccrosky

Wilma MCP Server

MCP (Model Context Protocol) 서버로, Visma의 핀란드 학교 커뮤니케이션 플랫폼인 Wilma를 위한 것입니다. 이를 통해 Claude 및 기타 MCP 호환 AI 어시스턴트가 시간표, 메시지 등을 포함한 학교 데이터와 상호작용할 수 있습니다.

기능

  • 시간표 - 과목, 시간, 교사가 포함된 일일 또는 주간 시간표 보기

  • 메시지 - 읽음/안 읽음 상태로 받은 편지함 메시지 읽기, 전체 내용 보기, 읽음 표시하기

  • 수신자 - 메시지를 보낼 수 있는 수신자(교사, 교직원) 목록 보기

  • 메시지 보내기 - 교사에게 메시지 작성 및 보내기

Related MCP server: Dnevnik.ru MCP Server

사전 요구 사항

  • Python 3.11 이상

  • Wilma 계정(학생, 보호자 또는 교사)

  • 학교의 Wilma URL (예: https://yourschool.inschool.fi)

설치

# 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 .

구성

Wilma 자격 증명이 담긴 .env 파일을 만드세요:

cp .env.example .env

.env 파일을 편집하세요:

WILMA_BASE_URL=https://yourschool.inschool.fi
WILMA_USERNAME=your_username
WILMA_PASSWORD=your_password

보안 참고: .env 파일을 버전 관리에 커밋하지 마세요.

OpenClaw와 함께 사용하기

OpenClaw를 사용한다면, 이 프로젝트에는 에이전트가 Wilma MCP 도구를 사용하는 방법을 자동으로 알려주는 SKILL.md가 포함되어 있습니다.

  1. 위의 설치 및 구성 단계를 완료하세요.

  2. MCP 서버를 Claude Code 설정에 추가하세요 (~/.claude.json 또는 프로젝트 .mcp.json):

{
  "mcpServers": {
    "wilma": {
      "command": "/path/to/wilma-mcp/venv/bin/python",
      "args": ["-m", "wilma_mcp.server"],
      "cwd": "/path/to/wilma-mcp"
    }
  }
}
  1. 에이전트가 찾을 수 있도록 SKILL.md를 OpenClaw 스킬 디렉토리에 넣거나 심볼릭 링크로 연결하세요.

Claude Desktop과 함께 사용하기

서버를 Claude Desktop 구성 파일에 추가하세요:

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"
    }
  }
}

구성을 업데이트한 후 Claude Desktop을 다시 시작하세요.

사용 가능한 도구

get_schedule

특정 날짜의 학교 시간표를 가져옵니다.

매개변수:

  • date_str (선택 사항): 시간표를 가져올 날짜. 기본값은 "today"입니다.

    • 지원: "today", "tomorrow", "yesterday"

    • 요일 이름: "monday", "tuesday" 등 (영어 또는 핀란드어)

    • 날짜 형식: "2024-03-15", "15.3.2024"

예시: "월요일 시간표가 뭐야?"

get_week_schedule

전체 주의 시간표를 가져옵니다.

매개변수:

  • start_date (선택 사항): 해당 주의 시작 날짜. 기본값은 오늘입니다.

예시: "다음 주 시간표를 보여줘"

get_messages

받은 편지함에서 메시지 목록을 가져옵니다. 각 메시지에는 읽음/안 읽음 표시(📖 읽음, 📬 안 읽음)가 나타납니다.

매개변수:

  • folder (선택 사항): 폴더 이름 - "inbox", "sent", "archive" 또는 "drafts". 기본값은 "inbox"입니다.

  • limit (선택 사항): 반환할 최대 메시지 수. 기본값은 20입니다.

"sent"와 "drafts"의 경우 목록에는 보낸 사람 대신 수신자("To:")가 표시됩니다.

예시: "내 메시지 확인해 줘" / "내가 보낸 메시지 보여줘"

get_message

특정 메시지의 전체 내용을 읽습니다. 참고: 메시지를 열람하면 Wilma 서버에서 자동으로 읽음 처리됩니다.

매개변수:

  • message_id: 읽을 메시지의 ID.

예시: "메시지 12345를 읽어 줘"

set_message_read

메시지를 명시적으로 읽음으로 표시합니다. 전체 내용을 읽지 않고 메시지를 읽음으로 표시할 때 유용합니다. Wilma는 메시지를 안 읽음으로 표시하는 것을 지원하지 않습니다 — 이는 플랫폼 제한 사항입니다.

매개변수:

  • message_id: 읽음으로 표시할 메시지의 ID.

예시: "메시지 12345를 읽음으로 표시해 줘"

get_recipients

사용 가능한 메시지 수신자(교사, 교직원, 보호자) 목록을 가져옵니다.

매개변수:

  • query (선택 사항): 대소문자를 구분하지 않는 이름 필터(예: 교사의 성). 학교의 전체 수신자 목록이 길 수 있으므로 유용합니다.

각 반환된 수신자에는 id 문자열(예: r_guardian=11876_2893&n_class=33)이 있으며, 이를 send_message에 직접 전달할 수 있습니다.

예시: "누구에게 메시지를 보낼 수 있지?" / "Smith 선생님의 수신자를 찾아 줘"

send_message

모든 수신자(교사, 교직원 또는 보호자)에게 새 메시지를 보냅니다.

매개변수:

  • recipient: 보낼 대상 — 사람의 이름(예: "Galiana Fatima", 수신자 목록에서 자동으로 확인됨) 또는 get_recipients의 수신자 id(예: "r_guardian=11876_2893&n_class=33"). 여러 사람에게 보내려면 id를 &로 연결하세요.

  • subject: 메시지 제목

  • body: 메시지 본문/내용

이름이 여러 사람과 일치하면 도구는 일치하는 목록을 반환하므로 특정 id를 선택할 수 있습니다(추측하지 않습니다).

예시: "Smith 선생님에게 숙제에 관한 메시지를 보내 줘"

기존 메시지에 회신하려면 reply_to_message를 대신 사용하세요 — 원본 메시지에서 수신자를 자동으로 확인합니다.

reply_to_message

기존 메시지에 회신합니다. Wilma의 회신 양식을 통해 수신자 확인을 자동으로 처리하므로 수신자 ID를 조회할 필요 없이 회신하는 권장 방법입니다.

매개변수:

  • message_id: 회신할 메시지의 ID (get_messages에서 가져옴)

  • body: 회신 메시지 본문/내용

예시: "메시지 12345에 참석하겠다고 회신해 줘"

대화 예시

구성이 완료되면 Claude에게 다음과 같이 물어볼 수 있습니다:

  • "오늘 시간표가 뭐야?"

  • "금요일에 수업 있어?"

  • "안 읽은 메시지 보여줘"

  • "선생님에게 온 메시지 읽어 줘"

  • "내일 학교 몇 시에 시작해?"

기술 참고 사항

  • Wilma에는 공식 공개 API가 없습니다. 이 서버는 웹 인터페이스를 리버스 엔지니어링합니다.

  • 인증은 로그인 흐름을 통해 얻은 세션 쿠키를 사용합니다.

  • 시간표 데이터는 시간표 페이지에 포함된 JavaScript에서 추출됩니다.

  • 메시지 목록은 폴더별 JSON 엔드포인트를 사용합니다 (받은 편지함의 경우 /messages/list, 보낸 편지함의 경우 /messages/list/outbox, /messages/list/archive, /messages/list/drafts); 개별 메시지는 HTML 파싱이 필요합니다.

  • 읽음/안 읽음 추적: Wilma의 JSON API에는 메시지별로 Status 필드가 있습니다 — truthy는 안 읽음, falsy/부재는 읽음을 의미합니다. 메시지를 열람하면 (GET 요청) 서버 측에서 읽음으로 표시됩니다. 메시지를 안 읽음으로 표시하는 API는 없습니다.

  • 메시지 보내기: Wilma는 수신자를 <option> 요소로 노출하지 않습니다. 수신자 선택기(/messages/recipients)는 각 연락 가능한 사람을 .recipient-block으로 포함하며, 그 data-source 링크는 r_<type>=<id> 형식의 선택자를 인코딩합니다 (예: r_guardian, r_personnel, r_ownteachers). 메시지를 작성하기 위해 서버는 /messages/compose?<selector>를 GET합니다 (새로운 formkey가 있는 양식과 수신자가 숨겨진 r_<type> 입력으로 미리 추가된 상태를 반환합니다). 그런 다음 Subject 및 BodyText 필드를 채우고 addsavebtn "보내기" 버튼으로 POST합니다. 이것이 회신뿐만 아니라 새 메시지도 이제 작동하는 이유입니다.

  • Wilma의 웹 인터페이스가 변경되면 서버 업데이트가 필요할 수 있습니다.

개발

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

향후 기능 (계획)

  • 성적 및 평가

  • 결석/출석 기록

  • 다가오는 시험

  • 학교 소식/공지

  • 강좌 목록

라이선스

MIT 라이선스 - LICENSE 파일을 참조하세요.

고지 사항

이 프로젝트는 비공식 프로젝트이며 Visma와 제휴하거나 보증하지 않습니다. 사용에 따른 책임은 본인에게 있습니다. Wilma의 서비스 약관과 요청 속도 제한을 준수하시기 바랍니다.

기여

기여를 환영합니다! 언제든지 Pull Request를 제출해 주세요.

Available Tools

8 tools
get_messageA

Read a specific message with full content.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe ID of the message to read.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of messages to return (default 20)
folderNoFolder to read from. Options: "inbox", "sent", "archive"inbox

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_strNoDate 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
start_dateNoStart date of the week. Defaults to today.today

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesReply message body/content
message_idYesID of the message to reply to (from get_messages)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesMessage body/content
subjectYesMessage subject
reply_to_idNoOptional message ID if this is a reply
recipient_idYesID of the recipient (use get_recipients to find IDs)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior1/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe ID of the message to mark as read.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 8 tool updatesv0.1.0
    • First observedget_message
    • First observedget_messages
    • First observedget_recipients
    • First observedget_schedule
    • First observedget_week_schedule
    • First observedreply_to_message
    • First observedsend_message
    • First observedset_message_read

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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 npm
    6
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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.
    2
    MIT