Smartschool MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | Bind address (HTTP only) | 0.0.0.0 |
| MCP_PORT | No | Port (HTTP only) | 8000 |
| MCP_API_KEY | No | Static Bearer token (single-user mode) | |
| MCP_TRANSPORT | No | stdio or streamable-http | stdio |
| MCP_UNIVERSAL | No | Enable universal mode (set to 1, true, or yes) | |
| SMARTSCHOOL_MFA | No | Date of birth YYYY-MM-DD (if required) | |
| SESSION_TTL_SECONDS | No | How long to cache sessions (universal mode) | 3600 |
| SMARTSCHOOL_MAIN_URL | No | School hostname, e.g. school.smartschool.be | |
| SMARTSCHOOL_PASSWORD | No | Your Smartschool password | |
| SMARTSCHOOL_USERNAME | No | Your Smartschool username |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_coursesA | Retrieve all available courses with their teachers. Returns: List of courses with name and teacher information. |
| get_resultsA | Retrieve student results/grades with detailed information. Args: limit: Maximum number of results to return (default: 15) offset: Number of results to skip from the beginning (default: 0) course_filter: Filter results by course name (partial match, case-insensitive) include_details: Whether to fetch detailed info (teacher, average, median) - saves API calls if False Returns: Dictionary with results list and pagination info. Examples: - get_results() -> First 15 results with details - get_results(course_filter="Math") -> Results from courses containing "Math" - get_results(include_details=False) -> Basic info only, faster response |
| get_future_tasksB | Retrieve upcoming assignments and tasks. Returns: Dictionary with future tasks organized by date and course. |
| get_messagesA | Retrieve messages from the specified mailbox with filtering options. Args: limit: Maximum number of messages to return (default: 15) offset: Number of messages to skip from the beginning (default: 0) box_type: Type of mailbox - "INBOX", "SENT", "DRAFT", "SCHEDULED", "TRASH" (default: "INBOX") search_query: Search in subject and body content (case-insensitive) sender_filter: Filter messages by sender name (partial match, case-insensitive) include_body: Whether to include full message body (default: False for performance) Returns: Dictionary with messages list and pagination info. Examples: - get_messages() -> First 15 inbox messages (headers only) - get_messages(search_query="homework") -> Messages containing "homework" - get_messages(sender_filter="teacher") -> Messages from senders containing "teacher" - get_messages(include_body=True) -> Full messages with body content |
| get_scheduleA | Retrieve the lesson schedule for a given day. Args: date_offset: Days from today (0=today, 1=tomorrow, -1=yesterday, default: 0) Returns: Dictionary with the lessons scheduled for the given date. |
| get_periodsA | Retrieve academic periods/terms for the current school year. Returns: List of academic periods with name, dates, and active status. |
| get_reportsA | Retrieve available academic report cards. Returns: List of report cards with name, date, class, and school year label. |
| get_planned_elementsB | Retrieve planned assignments and to-dos from the Smartschool planner. Args: days_ahead: Number of days ahead to fetch (default: 34) Returns: Dictionary with planned elements including dates, courses, and assignment types. |
| get_student_support_linksA | Retrieve student support links and resources. Returns: List of visible support links with name, description, and URL. |
| get_attachmentsA | List all attachments for a specific message. Args: message_id: The ID of the message to get attachments for (from get_messages results). Returns: Dictionary with attachment list including file names, sizes, and IDs for downloading. Examples: - get_attachments(249184) -> List attachments for message 249184 |
| download_attachmentA | Download a specific attachment from a message. Files are saved to save_path when provided, otherwise to
~/Downloads/smartschool/. The directory is created automatically.
Existing files are never overwritten — a counter suffix is appended
instead (e.g. Args: message_id: The ID of the message containing the attachment. file_id: The file ID of the attachment to download (from get_attachments). save_path: Optional directory to save the file into. Returns: Dictionary with the saved file path, filename, mime type, and bytes written. Examples: - download_attachment(249184, 12345) -> Download to ~/Downloads/smartschool/ - download_attachment(249184, 12345, "/tmp") -> Download to /tmp/ |
| get_homepage_blocksA | Retrieve the "in de kijker" blocks pinned to the Smartschool homepage. Schools use these blocks for recurring content that is never sent as a
message and never lands in a document module — a monthly lunch menu
("Maandmenu"), a monthly calendar ("Maandkalender"), announcements. The
content is frequently an embedded image rather than text, so Args: include_html: Also return each block's raw inner HTML (default: False). Returns: Dictionary with the list of blocks. Each block has a title, its news_id, plain text, and absolute URLs for any embedded images and links. Examples: - get_homepage_blocks() -> [{"title": "Maandmenu", "images": [...]}, ...] |
| download_homepage_imageA | Download an image embedded in a homepage block. Use the URLs returned in Args: image_url: Image URL from get_homepage_blocks. save_path: Optional directory to save into (default: ~/Downloads/smartschool/). Returns: Dictionary with the saved file path and bytes written. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 13 tools
Most tools target clearly distinct resources (courses, results, messages, schedule, reports, etc.). However, get_future_tasks and get_planned_elements both describe retrieval of upcoming assignments/tasks, creating potential ambiguity.
All tools follow a consistent lowercase snake_case verb_noun pattern: get_* for retrieval and download_* for file downloads. No mixed conventions or unpredictable naming styles.
13 tools is well within the typical 3-15 range and each tool serves a distinct read-only purpose within the Smartschool domain. The count feels complete without being bloated.
The server covers a broad read-only surface for Smartschool: courses, results, schedules, messages, attachments, reports, planner, homepage blocks, and support links. Minor gaps exist, such as no ability to fetch detailed course content or timeline events, but core workflows are covered.