Wilma MCP Server
Servidor MCP para Wilma
Un servidor MCP (Model Context Protocol) para Wilma – la plataforma de comunicación escolar finlandesa de Visma. Permite que Claude y otros asistentes de IA compatibles con MCP interactúen con datos escolares como horarios, mensajes y más.
Funcionalidades
Horario – Consulta horarios diarios o semanales con asignaturas, horarios y profesores
Mensajes – Lee mensajes de la bandeja de entrada con estado leído/no leído, visualiza el contenido completo, marca como leídos
Destinatarios – Lista los destinatarios de mensajes disponibles (profesores, personal)
Enviar mensajes – Redacta y envía mensajes a profesores
Related MCP server: Dnevnik.ru MCP Server
Requisitos previos
Python 3.11 o superior
Una cuenta de Wilma (estudiante, tutor o profesor)
La URL de Wilma de tu escuela (p. ej.,
https://yourschool.inschool.fi)
Instalación
# 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 .Configuración
Crea un archivo .env con tus credenciales de Wilma:
cp .env.example .envEdita .env:
WILMA_BASE_URL=https://yourschool.inschool.fi
WILMA_USERNAME=your_username
WILMA_PASSWORD=your_passwordNota de seguridad: Nunca subas tu archivo
.enval control de versiones.
Uso con OpenClaw
Si usas OpenClaw, este proyecto incluye un SKILL.md que enseña automáticamente a tu agente cómo usar las herramientas MCP de Wilma.
Completa los pasos de Instalación y Configuración anteriores.
Añade el servidor MCP a la configuración de tu Claude Code (
~/.claude.jsono.mcp.jsondel proyecto):
{
"mcpServers": {
"wilma": {
"command": "/path/to/wilma-mcp/venv/bin/python",
"args": ["-m", "wilma_mcp.server"],
"cwd": "/path/to/wilma-mcp"
}
}
}Coloca o enlaza simbólicamente el
SKILL.mden tu directorio de habilidades de OpenClaw para que el agente pueda descubrirlo.
Uso con Claude Desktop
Añade el servidor al archivo de configuración de 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"
}
}
}Reinicia Claude Desktop después de actualizar la configuración.
Herramientas disponibles
get_schedule
Obtén el horario escolar para una fecha concreta.
Parámetros:
date_str(opcional): Fecha para la que obtener el horario. Por defecto es "today".Admite: "today", "tomorrow", "yesterday"
Nombres de días de la semana: "monday", "tuesday", etc. (inglés o finés)
Formatos de fecha: "2024-03-15", "15.3.2024"
Ejemplo: "¿Cuál es mi horario para el lunes?"
get_week_schedule
Obtén el horario de una semana completa.
Parámetros:
start_date(opcional): Fecha de inicio de la semana. Por defecto es hoy.
Ejemplo: "Muéstrame el horario de la próxima semana"
get_messages
Obtén la lista de mensajes de la bandeja de entrada. Cada mensaje muestra un indicador de leído/no leído (📖 leído, 📬 no leído).
Parámetros:
folder(opcional): Nombre de la carpeta – "inbox", "sent", "archive" o "drafts". Por defecto es "inbox".limit(opcional): Número máximo de mensajes a devolver. Por defecto es 20.
Para "sent" y "drafts", el listado muestra el destinatario ("Para:") en lugar del remitente.
Ejemplo: "Revisa mis mensajes" / "Muestra mis mensajes enviados"
get_message
Lee un mensaje específico con su contenido completo. Nota: visualizar un mensaje lo marca automáticamente como leído en el servidor de Wilma.
Parámetros:
message_id: El ID del mensaje a leer.
Ejemplo: "Lee el mensaje 12345"
set_message_read
Marca explícitamente un mensaje como leído. Útil para marcar mensajes como leídos sin leer su contenido completo. Wilma no permite marcar mensajes como no leídos; es una limitación de la plataforma.
Parámetros:
message_id: El ID del mensaje a marcar como leído.
Ejemplo: "Marca el mensaje 12345 como leído"
get_recipients
Obtén la lista de destinatarios de mensajes disponibles (profesores, personal, tutores).
Parámetros:
query(opcional): Filtro de nombre que no distingue mayúsculas/minúsculas (p. ej., el apellido de un profesor). Útil porque la lista completa de destinatarios de una escuela puede ser larga.
Cada destinatario devuelto tiene una cadena id (p. ej., r_guardian=11876_2893&n_class=33) que puedes pasar directamente a send_message.
Ejemplo: "¿A quién puedo enviar mensajes?" / "Busca el destinatario para el Sr. Smith"
send_message
Envía un nuevo mensaje a cualquier destinatario (profesor, miembro del personal o tutor).
Parámetros:
recipient: A quién enviarlo – ya sea el nombre de una persona (p. ej.,"Galiana Fatima", resuelto automáticamente contra la lista de destinatarios) o un id de destinatario deget_recipients(p. ej.,"r_guardian=11876_2893&n_class=33"). Para dirigirse a varias personas, une sus ids con&.subject: Asunto del mensajebody: Cuerpo/contenido del mensaje
Si un nombre coincide con más de una persona, la herramienta devuelve la lista de coincidencias para que puedas elegir un id específico (no adivinará).
Ejemplo: "Envía un mensaje al Sr. Smith sobre los deberes"
Para responder a un mensaje existente, usa
reply_to_messageen su lugar: resuelve el destinatario automáticamente a partir del mensaje original.
reply_to_message
Responde a un mensaje existente. Esta es la forma preferida de responder, ya que gestiona la resolución del destinatario automáticamente a través del formulario de respuesta de Wilma, sin necesidad de buscar IDs de destinatarios.
Parámetros:
message_id: ID del mensaje al que responder (deget_messages)body: Cuerpo/contenido del mensaje de respuesta
Ejemplo: "Responde al mensaje 12345 diciendo que asistiré"
Conversaciones de ejemplo
Una vez configurado, puedes preguntar a Claude:
"¿Cuál es mi horario de hoy?"
"¿Tengo clases el viernes?"
"Muéstrame mis mensajes no leídos"
"Lee el mensaje de mi profesor"
"¿A qué hora empieza la escuela mañana?"
Notas técnicas
Wilma no tiene una API pública oficial. Este servidor realiza ingeniería inversa de la interfaz web.
La autenticación utiliza cookies de sesión obtenidas mediante el flujo de inicio de sesión.
Los datos del horario se extraen de JavaScript incrustado en la página del horario.
Las listas de mensajes usan endpoints JSON por carpeta (
/messages/listpara la bandeja de entrada,/messages/list/outboxpara enviados,/messages/list/archive,/messages/list/drafts); los mensajes individuales requieren análisis HTML.Seguimiento de leído/no leído: La API JSON de Wilma incluye un campo
Statuspor mensaje – verdadero significa no leído, falso/ausente significa leído. Visualizar un mensaje (solicitud GET) lo marca como leído en el servidor. No hay API para marcar un mensaje como no leído.Envío de mensajes: Wilma no expone destinatarios como elementos
<option>. El selector de destinatarios (/messages/recipients) incrusta cada persona contactable como un.recipient-blockcuyo enlacedata-sourcecodifica un selector de la formar_<type>=<id>(p. ej.,r_guardian,r_personnel,r_ownteachers). Para redactar, el servidor hace GET a/messages/compose?<selector>(que devuelve el formulario con unaformkeynueva y el destinatario ya añadido como una entrada ocultar_<type>), rellena los camposSubjectyBodyText, y hace POST con el botónaddsavebtnde "send". Por eso ahora funcionan los mensajes nuevos, no solo las respuestas.Es posible que el servidor necesite actualizaciones si la interfaz web de Wilma cambia.
Desarrollo
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytestFuncionalidades futuras (planificadas)
Calificaciones y evaluaciones
Registros de ausencia/asistencia
Exámenes próximos
Noticias/anuncios escolares
Listados de cursos
Licencia
Licencia MIT – consulta el archivo LICENSE.
Aviso legal
Este es un proyecto no oficial y no está afiliado ni respaldado por Visma. Úsalo bajo tu propio riesgo. Respeta los términos de servicio y los límites de tasa de Wilma.
Contribuciones
¡Las contribuciones son bienvenidas! No dudes en enviar una Pull Request.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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.9374MIT
- 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.4143MIT
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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jmccrosky/wilma-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server