unofficial-magister-mcp
Click on "Install 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., "@unofficial-magister-mcpWhat time do I need to drop off the kids tomorrow?"
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.
unofficial-magister-mcp
An MCP (Model Context Protocol) 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.
Note: This is an unofficial package and is not affiliated with Magister or Iddink Group.
Why I Built This
As a parent, I found myself constantly checking the Magister app to plan our mornings and afternoons. "What time does school start tomorrow?" "When's the last class on Friday?" These questions came up daily, and I wanted my AI assistant to just... know.
This MCP server lets you ask your AI agent natural questions like:
"What time do I need to drop off the kids tomorrow?"
"What's the schedule for next Monday?"
"When does school end on Wednesday?"
No more app switching. Just ask and plan.
Related MCP server: pronote-mcp
Features
Schedule queries - Get daily or weekly school schedules
Drop-off/pick-up times - Quickly find first and last class times for planning
Parent account support - Works with both student and parent accounts
Session persistence - Saves auth state to avoid repeated logins
Smart caching - 5-minute cache with stale-while-revalidate pattern
API with DOM fallback - Uses Magister API with automatic fallback to DOM scraping
Requirements
Node.js 20 or later
A Magister account (student or parent)
~150MB disk space (Playwright browsers)
Installation
npm install -g unofficial-magister-mcpOr run directly with npx:
npx unofficial-magister-mcpConfiguration
Create a .env file or set environment variables:
MAGISTER_SCHOOL=schoolname.magister.net
MAGISTER_USER=your-username
MAGISTER_PASS=your-passwordUsage with Claude Code
Add to your Claude Code MCP configuration (~/.claude/claude_code_config.json):
{
"mcpServers": {
"magister": {
"command": "npx",
"args": ["-y", "unofficial-magister-mcp"],
"env": {
"MAGISTER_SCHOOL": "schoolname.magister.net",
"MAGISTER_USER": "your-username",
"MAGISTER_PASS": "your-password"
}
}
}
}Available Tools
get_schedule
Get the school schedule for a specific date.
Parameters:
date(required): Date string - "today", "tomorrow", weekday name, or YYYY-MM-DD format
Example response:
Schedule for Sat Jan 04 2025:
08:30 - 09:20: Mathematics (Mr. de Vries) @ Room 101
09:25 - 10:15: Dutch (Ms. Jansen) @ Room 203
10:30 - 11:20: English (Mr. Smith) @ Room 105get_week_schedule
Get the school schedule for the next 7 days.
Parameters: None
get_dropoff_time
Get the first class time for drop-off planning.
Parameters:
date(required): Date string - "today", "tomorrow", weekday name, or YYYY-MM-DD format
Example response:
First class on Mon Jan 06 2025: Mathematics at 08:30 @ Room 101get_pickup_time
Get the last class end time for pick-up planning.
Parameters:
date(required): Date string - "today", "tomorrow", weekday name, or YYYY-MM-DD format
Example response:
Last class on Mon Jan 06 2025: History ends at 15:45 @ Room 301How It Works
Authentication: Uses Playwright to automate Magister login, capturing OAuth tokens
Session persistence: Saves browser state to
.auth-state.jsonto avoid re-loginAPI access: Fetches schedules via Magister's internal API
Fallback: If API fails, falls back to DOM scraping
Caching: Caches results for 5 minutes with SWR pattern
Parent Accounts
If you log in with a parent account, the server automatically detects linked children and uses the first child's schedule. Multi-child selection is planned for a future release.
Troubleshooting
"Missing required environment variables"
Make sure all three environment variables are set:
MAGISTER_SCHOOL- The school's Magister subdomain (e.g.,schoolname.magister.net)MAGISTER_USER- Your usernameMAGISTER_PASS- Your password
Authentication issues
Check the log file at
/tmp/magister-mcp.logfor detailsDelete
.auth-state.jsonto force a fresh loginVerify your credentials work on the Magister website
Schedule not updating
The server caches schedules for 5 minutes. If you need fresh data, wait for the cache to expire or restart the server.
Development
# Clone the repository
git clone https://github.com/israelroldan/unofficial-magister-mcp.git
cd unofficial-magister-mcp
# Install dependencies
npm install
# Run in development mode
npm run dev
# Build for production
npm run build
# Run linting
npm run lint
# Format code
npm run formatLicense
MIT - see LICENSE
Disclaimer
This is an unofficial tool that interacts with Magister.net through browser automation. It may break if Magister changes their website. Use at your own risk.
The author is not affiliated with Magister, Schoolmaster B.V., Iddink Group, or any of their subsidiaries. "Magister" is a trademark of Iddink Group.
Available Tools
4 toolsget_dropoff_timeA
Get the time of the first class (for drop-off planning)
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date to check. Can be "today", "tomorrow", a weekday name, or YYYY-MM-DD format |
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 behavioral disclosure. It only states the operation but does not mention what happens on invalid dates, return format, or any edge-case behavior. This is minimal transparency beyond the obvious read operation.
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 gets straight to the point. Every word adds value, and the parenthetical provides context without fluff.
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 1-parameter tool with full schema coverage, the description provides the core purpose. However, the lack of an output schema and annotations means it should offer more detail about return values or error behavior. Adequate but with clear gaps.
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 coverage for the only parameter 'date' is 100%, and its description fully explains acceptable formats. The tool description adds no extra parameter meaning, 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 time of the first class'. It specifies the resource (first class time) and context ('for drop-off planning'), which distinguishes it from sibling tools like get_pickup_time and get_schedule.
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 parenthetical 'for drop-off planning' implies a usage context, but the description does not explicitly state when to use this tool versus alternatives or provide exclusionary guidance. It lacks the explicit alternative naming seen in high-quality examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pickup_timeA
Get the time of the last class (for pick-up planning)
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date to check. Can be "today", "tomorrow", a weekday name, or YYYY-MM-DD format |
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 describes a safe read operation (get), but it does not disclose output format, error handling, or edge cases. For a simple getter, this is basic but incomplete 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 concise sentence that delivers the essential information without redundancy. It is appropriately front-loaded and 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?
Given the tool's low complexity (one parameter, no output schema, no annotations), the description is reasonably complete. It explains the core function and purpose, though it could mention return format or edge cases for extra clarity.
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 date parameter is fully documented in the schema. The description adds no additional parameter semantics, hence the baseline score of 3.
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 gets the time of the last class, with a parenthetical clarifying its purpose (pick-up planning). This distinguishes it from siblings like get_schedule or get_dropoff_time, though it does not explicitly name alternatives.
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 'for pick-up planning' provides a clear context for when to use this tool. However, it does not explicitly state when not to use it or mention alternative tools, 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.
get_scheduleA
Get school schedule for a specific date
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date to get schedule for. Can be "today", "tomorrow", a weekday name, or YYYY-MM-DD format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states the function (get schedule) without mentioning return format, whether this is a read-only operation, or any potential side effects. For a simple get, this is minimal but still lacks transparency beyond the obvious.
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, focused sentence. It is front-loaded with the verb and resource, with no wasted words.
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 with one well-documented parameter and no output schema. The description covers the core purpose but does not clarify what the response contains or edge cases (e.g., holidays, invalid dates). It is adequate for a simple get but leaves some ambiguity.
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% and the date parameter is clearly documented with accepted formats. The description adds no extra semantic value beyond restating 'specific date', 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 gets a school schedule for a specific date. This distinguishes it from siblings like get_week_schedule (which covers a week) and get_dropoff_time/get_pickup_time (which target specific times).
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 implied usage is for retrieving a single date's schedule, contrasting with the weekly variant. However, there is no explicit guidance on when to choose this tool over alternatives, no exclusions, and no mention of prerequisites.
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 school schedule for the entire week (next 7 days)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 behavioral disclosure. It only states that it retrieves the schedule but gives no information about the return format, content of the schedule, potential timezone considerations, or any side effects (though it's clearly a read operation). This is a minimal statement.
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 key information: the action and the scope. Every word adds value, and there is no superfluous detail.
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 zero-parameter getter, the description is largely sufficient: it states the resource and the time window. It does not describe the structure of the returned schedule, but given the context and sibling names, this may be acceptable. It is complete enough for an agent to know when to call it and what it will receive.
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 description does not need to add parameter-level detail. The baseline for 0 parameters is 4, and nothing in the description detracts from that. The schema's 100% coverage of an empty properties object confirms no parameter ambiguity.
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') with a clear resource ('school schedule') and explicit scope ('entire week (next 7 days)'). It clearly distinguishes this from sibling tools like get_dropoff_time and get_pickup_time, and even from get_schedule by specifying the week-long period.
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 when to use this tool: when a week-long schedule is needed. The phrase '(next 7 days)' provides clear context. However, it does not explicitly mention alternatives or exclusion criteria (e.g., 'use get_schedule for a specific day').
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. Dates show when Glama detected each change.
4 tool updates
v1.0.2- First observed
get_dropoff_time - First observed
get_pickup_time - First observed
get_schedule - First observed
get_week_schedule
TDQS
Each tool serves a distinct purpose: get_schedule for a specific date, get_week_schedule for a weekly view, get_dropoff_time for the first class time, and get_pickup_time for the last class time. There is no overlap or ambiguity between them.
All tool names follow the consistent pattern 'get_<noun>' (get_schedule, get_week_schedule, get_dropoff_time, get_pickup_time). The convention is uniform and predictable.
With only 4 tools, the server is well-scoped and each tool serves a necessary function for schedule-related queries. The count is within the ideal range for a focused utility.
For the apparent purpose of reading school schedule information, the surface is complete: it covers daily schedules, weekly schedules, and the two key time points (first and last class). No obvious gaps exist.
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 Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server providing attendance data queries via the CloudTime API.
Related MCP Servers
- AlicenseAqualityDmaintenanceConnect Claude and other MCP clients to your Smartschool account to ask about grades, assignments, messages, and your schedule in plain language.113MIT
- -licenseNot gradedqualityNot gradedmaintenanceA local MCP server that exposes Pronote (French school management system) data via MCP, enabling AI assistants to retrieve schedules, homework, grades, absences, and more. Supports token-based authentication with QR code setup.-
- AlicenseNot gradedqualityDmaintenanceA local MCP server that enables LLMs like Claude to access Schulmanager Online data including schedules, homework, exams, grades, and parental letters.1-
- AlicenseNot gradedqualityCmaintenanceMCP server that gives Claude Desktop access to school data from Studie+ (Danish school platform), enabling queries about schedules, homework, assignments, and files directly in chat.MIT
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/israelroldan/unofficial-magister-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server