Skip to main content
Glama
KVerduyn

School Vacation MCP Server

by KVerduyn

School Vacation MCP Server

A Model Context Protocol (MCP) server for querying school vacation calendars across Belgium, Netherlands, and Luxembourg (2019-2028).

Protocol Version: MCP 2025-06-18 SDK Version: @modelcontextprotocol/sdk v1.21.0

Features

  • πŸ—“οΈ School vacation calendar data for 2019-2028

  • 🌍 Multi-region support: Belgium (Flanders, Wallonia), Netherlands (North, Middle, South), Luxembourg

  • πŸ”§ Three tools: check dates, get vacation periods, list regions

  • πŸ”’ Token-based authentication for production

  • πŸ“ Audit logging for all requests

  • πŸš€ Multiple deployment modes: stdio, HTTP, Docker

  • πŸ”— LibreChat integration ready (see LIBRECHAT_INTEGRATION.md)

Quick Start

Installation

npm install
npm run build

Development Mode (No Authentication)

# stdio server (for MCP clients)
npm run dev

# HTTP+MCP server (for REST and MCP clients)
npm run dev:mcp

Production Mode (With Authentication)

# Generate a secure token
export MCP_AUTH_TOKEN=$(openssl rand -hex 32)

# Or set a custom token
export MCP_AUTH_TOKEN="your-secret-token"

# Start the server
npm run build
npm run start:mcp

Docker Deployment

# Set auth token
echo "MCP_AUTH_TOKEN=your-secret-token" > .env

# Start with Docker Compose
docker-compose up -d

# Check health
curl http://localhost:3000/health

LibreChat Integration

This server is configured to work with LibreChat on the LibreChat Docker network. See the complete integration guide: LIBRECHAT_INTEGRATION.md

Quick integration:

# From LibreChat container, MCP server is accessible at:
http://school-vacation-mcp:3000/mcp

Available Tools

1. check_school_vacation

Check if a specific date is a school vacation day in a given region.

Parameters:

  • date (string, required): Date in DD/MM/YYYY format (e.g., "25/12/2024")

  • region (string, required): One of: flanders, wallonia, north-netherlands, middle-netherlands, south-netherlands, luxembourg

Example:

{
  "name": "check_school_vacation",
  "arguments": {
    "date": "25/12/2024",
    "region": "flanders"
  }
}

2. get_vacation_periods

Get all school vacation periods for a region, optionally filtered by year.

Parameters:

  • region (string, required): Region code

  • year (number, optional): Year between 2019-2028

Example:

{
  "name": "get_vacation_periods",
  "arguments": {
    "region": "flanders",
    "year": 2024
  }
}

3. get_supported_regions

Get a list of all supported regions.

Parameters: None

Example:

{
  "name": "get_supported_regions",
  "arguments": {}
}

Server Modes

1. stdio Server (Standard MCP)

For integration with MCP clients like Claude Desktop:

npm run start

Configuration for Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "school-vacation": {
      "command": "node",
      "args": ["/path/to/School_MCP/dist/index.js"]
    }
  }
}

2. HTTP Server (REST API)

Basic REST API without MCP protocol:

npm run start:http

Endpoints:

  • GET /health - Health check

  • GET /ping - Connectivity test

  • POST /tools/* - Tool execution endpoints

Supports both REST API and MCP JSON-RPC 2.0 protocol:

npm run start:mcp

Endpoints:

  • GET /health - Health check

  • GET /ping - Connectivity test

  • POST /mcp - MCP JSON-RPC 2.0 endpoint (authentication required in production)

API Examples

MCP Protocol (JSON-RPC 2.0)

Initialize:

curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your-token" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-06-18",
      "capabilities": {},
      "clientInfo": {"name": "test", "version": "1.0.0"}
    }
  }'

List Tools:

curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your-token" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/list"
  }'

Call Tool:

curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer your-token" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "check_school_vacation",
      "arguments": {
        "date": "25/12/2024",
        "region": "flanders"
      }
    }
  }'

Authentication

Development Mode

When MCP_AUTH_TOKEN is not set, authentication is disabled. This is suitable for local development only.

npm run dev:mcp
# Server runs without authentication

Production Mode

When MCP_AUTH_TOKEN is set, all requests to /mcp endpoint require authentication:

export MCP_AUTH_TOKEN="your-secret-token"
npm run start:mcp

Request with authentication:

curl -X POST http://localhost:3000/mcp \
  -H "Authorization: Bearer your-secret-token" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Without authentication (will return 401 error):

curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Configuration

Environment Variables

Create a .env file based on .env.example:

cp .env.example .env

Available variables:

  • MCP_AUTH_TOKEN - Authentication token (leave empty for dev mode)

  • PORT - Server port (default: 3000)

  • NODE_ENV - Environment (development/production)

Docker Configuration

Edit docker-compose.yml to configure the Docker deployment:

environment:
  - NODE_ENV=production
  - PORT=3000
  - MCP_AUTH_TOKEN=${MCP_AUTH_TOKEN:-}

MCP 2025-06-18 Compliance

This server is compliant with the MCP 2025-06-18 specification:

βœ… Implemented:

  • JSON-RPC 2.0 protocol

  • Protocol version 2025-06-18

  • Capability negotiation

  • Tool definitions with JSON Schema

  • Proper error handling

  • Token-based authentication

  • Audit logging

⚠️ Optional (not implemented):

  • Full OAuth 2.0 / RFC 8707 (using basic token auth)

  • Elicitation support

  • Structured output schemas (Zod validation)

  • Rate limiting

See MCP_COMPLIANCE.md for detailed compliance analysis.

Project Structure

School_MCP/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ calendar-data.ts        # Core calendar data logic
β”‚   β”œβ”€β”€ index.ts                # stdio MCP server
β”‚   β”œβ”€β”€ http-server.ts          # REST API server
β”‚   β”œβ”€β”€ mcp-http-server.ts      # Combined HTTP+MCP server
β”‚   └── auth.ts                 # Authentication middleware
β”œβ”€β”€ dist/                       # Compiled JavaScript
β”œβ”€β”€ kalender 2019_2028.csv      # Calendar data
β”œβ”€β”€ package.json                # Dependencies
β”œβ”€β”€ tsconfig.json               # TypeScript config
β”œβ”€β”€ Dockerfile                  # Docker build config
β”œβ”€β”€ docker-compose.yml          # Docker Compose config
β”œβ”€β”€ MCP_COMPLIANCE.md          # Compliance report
β”œβ”€β”€ UPGRADE_SUMMARY.md         # Upgrade guide
└── README.md                  # This file

Data Coverage

  • Regions: Belgium (Flanders, Wallonia), Netherlands (North, Middle, South), Luxembourg

  • Years: 2019-2028

  • Data includes: Weekends, holidays, school vacation flags per region

Development

Build

npm run build

Run in development mode

# stdio server
npm run dev

# HTTP server
npm run dev:http

# Combined HTTP+MCP server
npm run dev:mcp

Testing

# Test stdio server
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}' | node dist/index.js

# Test HTTP server
npm run dev:mcp &
curl http://localhost:3000/health
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Security Best Practices

πŸ”’ For Production Deployment:

  1. Always set - Never run without authentication in production

  2. Use HTTPS/TLS - Encrypt traffic in production

  3. Strong tokens - Generate with openssl rand -hex 32

  4. Rotate tokens - Change authentication tokens regularly

  5. Monitor logs - Review audit logs for suspicious activity

  6. Network isolation - Use firewall rules to restrict access

  7. CORS configuration - Set specific origins, not wildcard

See MCP_COMPLIANCE.md for detailed security recommendations.

Troubleshooting

Port already in use

# Kill existing node processes
pkill node

# Or use a different port
PORT=3001 npm run start:mcp

Authentication errors

# Check if token is set
echo $MCP_AUTH_TOKEN

# Test without authentication in dev mode
unset MCP_AUTH_TOKEN
npm run dev:mcp

Docker issues

# Rebuild container
docker-compose down
docker-compose build --no-cache
docker-compose up

# Check logs
docker-compose logs -f

Upgrade Notes

This server was recently upgraded to MCP 2025-06-18. See UPGRADE_SUMMARY.md for:

  • Changes made during upgrade

  • Breaking changes from SDK v0.4.0 to v1.21.0

  • Migration guide for custom code

References

License

[Your License Here]

Contributing

[Your Contributing Guidelines Here]


Status: βœ… Production Ready Protocol: MCP 2025-06-18 SDK: v1.21.0 Last Updated: 2025-11-07

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

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/KVerduyn/School_MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server