uniboh
MCP server for University of Bologna services, enabling access to Virtuale, timetables, and exam plans through natural language.
README
uniboh — Unibo MCP Server
A Model Context Protocol server (stdio transport, TypeScript) that exposes University of Bologna services to MCP clients. Today it covers:
- virtuale.unibo.it — the Unibo Moodle instance, via its
service.phpAJAX API (enrolled courses, course state, Panopto content). - corsi.unibo.it — public course timetables, normalized to events and exported as an ICS calendar.
- almaesami.unibo.it — the student exam plan ("Riepilogo Esami"), read-only.
The longer-term goal is to wrap any Unibo service (RPS and others next) behind one MCP server — see CLAUDE.md.
Install
npm install
npm run build
Run
Stdio transport, for use by an MCP client.
No credentials (health check + calendar tools only):
npm run dev
With a preloaded session (enables the authenticated Virtuale tools):
VIRTUALE_BASE_URL="https://virtuale.unibo.it" \
VIRTUALE_SESSKEY="your_sesskey" \
VIRTUALE_COOKIES="MoodleSession=...; other_cookie=..." \
npm run dev
npm run start runs the compiled dist/server.js instead of tsx.
Environment variables
| Variable | Required | Purpose |
|---|---|---|
VIRTUALE_BASE_URL |
no (defaults to https://virtuale.unibo.it) |
Moodle base URL. |
VIRTUALE_SESSKEY |
no | Moodle sesskey; with VIRTUALE_COOKIES, enables authenticated tools without a login call. |
VIRTUALE_COOKIES |
no | Cookie header (e.g. MoodleSession=...). |
ALMAESAMI_BASE_URL |
no (defaults to https://almaesami.unibo.it) |
AlmaEsami base URL. |
ALMAESAMI_COOKIES |
no | Cookie header with an authenticated JSESSIONID; fallback for almaesami_get_exam_plan. |
Authentication
Authenticated Virtuale tools need both a sesskey and a cookie header. Three ways to provide them:
VIRTUALE_SESSKEY+VIRTUALE_COOKIESenv vars — set once at startup.virtuale_bootstrap_session— paste asesskey+ cookies grabbed from a logged-in browser; returns asession_id. This is the most reliable path for accounts behind Unibo SSO/MFA.virtuale_login_with_password— best-effort form login. It scrapes the Moodle login form and posts credentials. This will fail for accounts on federated SSO/MFA (most Unibo accounts); prefer bootstrap for those.
Session data is kept in server memory only and is never written to disk. Treat sesskey + cookies as account-bound secrets.
Tools
Session management
virtuale_login_with_password— form login → stores session, returnssession_id+sesskey.virtuale_bootstrap_session— build a session from an existingsesskey+ cookies.virtuale_get_session_info— stored session metadata (optionally the cookie header).virtuale_logout_session— drop one session from memory.virtuale_health_check— no-logincore_get_stringprobe for connectivity.
Virtuale (authenticated)
virtuale_get_enrolled_courses— wrapslocal_uniboapi_get_enrolled_courses_unibo.virtuale_get_course_state— wrapscore_courseformat_get_state, parses the state JSON.virtuale_get_panopto_content— wrapsblock_panopto_get_content.
Each accepts an optional session_id; if omitted, the env-var session is used.
Timetable / calendar (public, no auth)
unibo_calendar_resolve_timetable_url— find the corsi.unibo.it timetable URL from a course page.unibo_calendar_list_curricula— list curricula from@@available_curricula.unibo_calendar_list_teachings— extract teaching IDs from the timetable page.unibo_calendar_get_events— fetch@@orario_reale_jsonevents, optional teaching-code filter.unibo_calendar_get_ics— same, returned as an ICS calendar string.
AlmaEsami (authenticated)
-
almaesami_get_exam_plan— reads the student exam plan (activities, CFU, status, bookable flag). Read-only: it does not book exams. Passcookies(a cookie header with an authenticatedJSESSIONID) or setALMAESAMI_COOKIES.AlmaEsami is behind ADFS SSO with no JSON API, so authenticate the bootstrap way: log in via a browser, then copy the
JSESSIONIDcookie foralmaesami.unibo.it. Seealmaesami-rps-api-notes.md.
Calendar flow example
unibo_calendar_resolve_timetable_urlwith the unibo.it course URL.unibo_calendar_list_curriculawith the resolved timetable URL.- (optional)
unibo_calendar_list_teachingsto get teaching IDs to filter on. unibo_calendar_get_eventsorunibo_calendar_get_icswithyear,curriculum, and optional teaching codes.
Development
npm run typecheck # tsc --noEmit
npm test # node built-in test runner via tsx
npm run build # emit dist/
Tests live next to sources as src/*.test.ts and are excluded from the build.
Reference notes
virtuale.unibo.it-api-notes.md— reverse-engineered Moodle AJAX endpoints.unibo-timetable-calendar-api.md— corsi.unibo.it timetable API.- Timetable logic is informed by FrancescoBonzi/UniboCalendar.
License
ISC — see LICENSE.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.