Vigilo MCP Server
An MCP server that gives an agent personal, read-only access to a Norwegian school parent portal (Vigilo) — children, messages, weekly plans, timetable, absences, consents and news — across both the app gateway and the web parent portal.
List children —
list_children(childId via app gateway) andweb_list_children(childId + organizationalUnitId, school/class names)Messages —
list_message_threads,get_message_thread, andread_message_attachments(downloads and extracts text from PDF/docx attachments, e.g. weekly plans)News/posts —
news_feed(«Siste nytt», default last 30 days) andread_post_attachments(attachments on a post, often the week plan)Absences —
absencesper childConsents —
consent_forms(requires childId + organizationalUnitId)Timetable —
timetableandscheduling_events(tests/activities) for an ISO weekYYYY-WWExploration —
api_getandweb_api_getfor raw GETs against the app and web APIs to map new endpoints
All tools return text; authentication is a local OAuth token, and there are no write/action tools.
Click on "Deploy 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., "@Vigilo MCP Server read the latest message thread from my child's school"
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.
vigilo-connector
Personlig MCP-connector mot Vigilo sitt (uoffisielle) foreldre-API, slik at en agent kan lese beskjeder, timeplan, fravær, samtykker, nyheter m.m. og aksjonere på dem. Auth-flyten er inspirert av kartleggingen i brujoand/vigilo2smtp.
Kun til personlig bruk med egen foreldretilgang. API-et er reverse-engineert
og kan endres av Vigilo uten varsel — respektér Vigilos vilkår, og ikke hent mer
data enn du selv har tilgang til. Tokens og data holdes lokalt
(~/.config/vigilo-connector/, chmod 600) og legges aldri inn i repoet.
To API-er, ett token
Connectoren snakker med to endepunkter, og samme OAuth-token dekker begge:
App-gateway (
api-gw-parent-app.prod.vigilo-oas.no) — beskjeder/tråder.Web-foreldreportal (
web-parent.prod.vigilo-oas.no) — timeplan, fravær, samtykker, nyheter, vurdering. Det Vigilo-appen ikke eksponerer.
Auth er en konfidensiell OAuth2-client (Basic-auth med client_id/secret, uten
PKCE). Innloggingen federerer via ID-porten. Refresh-tokenet varer 30–90 dager;
da kjører du vigilo-login på nytt.
Related MCP server: fskintra-mcp
Oppsett
1. Client-credentials fra Android-appen
OAuth-clienten er Vigilos egen Android-app. Hent client_id og client_secret
fra APK-en (parent.vigilo.no.parentapplication):
Last ned APK-en, f.eks. med
apkeep:apkeep -a parent.vigilo.no.parentapplication .Dekompiler med
jadxog lesparent/vigilo/no/parentapplication/core/api/ApiConfig.java— enum-verdiene forPRODinneholderbaseUrl,client_id,client_secretog redirect-URI.Legg nøklene i
~/.config/vigilo-connector/config.json:
{ "client_id": "...", "client_secret": "..." }(Alternativt miljøvariablene VIGILO_CLIENT_ID / VIGILO_CLIENT_SECRET.)
2. Installer og logg inn
python3 -m venv .venv && .venv/bin/pip install -e .
.venv/bin/vigilo-loginvigilo-login skriver ut en innloggings-URL. Åpne den i en nettleser og logg
inn med ID-porten. Nettleseren ender til slutt på en
app://ch-parent-android.vigilo.no?code=...-adresse — det er suksess. Lim
hele adressen (eller bare code-verdien) inn i terminalen.
Viktige detaljer:
Er du allerede innlogget hos Vigilo, hopper URL-en rett gjennom (SSO) og redirecten skjer momentant. Chrome/Safari viser da bare en tom feilside for
app://-adressen og kan tømme adresselinjen. Åpne DevTools → Network og huk av Preserve log før du starter — den feiledeapp://-requesten blir liggende der med helecode=....Logg inn fra en maskin uten Vigilo-appen installert, ellers kan OS-et gi redirecten til appen, som bruker opp engangskoden.
Koder er engangs og kortlevde. Feiler utvekslingen: start en ny innlogging.
Headless innlogging (SSH / server uten skjerm)
På en maskin uten nettleser kan du ikke fange app://-redirecten lokalt. Bruk
--from-curl i stedet:
.venv/bin/vigilo-login --from-curlDen skriver ut en authorize-URL. Gjør så dette i en desktop-nettleser (på en maskin uten Vigilo-appen), der du er innlogget hos Vigilo:
Åpne DevTools → Network, naviger til den utskrevne URL-en.
Høyreklikk
authorize-requesten → Copy → Copy as cURL.Lim hele cURL-en inn i terminalen og avslutt med en linje
END(eller Ctrl-D).
Alternativt kan cURL-en leses fra fil eller pipe (mer robust for store blokker):
.venv/bin/vigilo-login --from-curl curl.txt # fra fil
pbpaste | ssh mini '~/Code/vigilo-connector/.venv/bin/vigilo-login --from-curl' # pipe over SSHVerktøyet henter sesjonscookiene ut av cURL-en, gjør authorize-kallet selv og
fanger koden fra redirecten — ingen manuell jakt på app://-adressen. Nettleser
og server trenger ikke være samme maskin.
(Alternativt: kjør innloggingen på en maskin med nettleser og kopier
~/.config/vigilo-connector/tokens.json over til serveren.)
3. Registrer MCP-serveren i Claude Code
claude mcp add vigilo -- /path/to/vigilo-connector/.venv/bin/vigilo-mcp(Bytt /path/to/vigilo-connector med din egen sti til repoet.)
Alternativ: JSON-konfig (import / manuell registrering)
Klienter som importerer MCP-servere fra JSON kan bruke denne blokken:
{
"mcpServers": {
"vigilo": {
"command": "/path/to/vigilo-connector/.venv/bin/vigilo-mcp"
}
}
}Skal du legge den til manuelt i en klient (MCP → sett opp manuelt), bruk stdio-transport med samme kommando:
{
"transport": "stdio",
"command": "/path/to/vigilo-connector/.venv/bin/vigilo-mcp"
}Verktøy
Verktøy | Gjør |
| Barna dine med |
| Barna via app-gatewayen (kun |
| Beskjedtråder og meldinger (app-gateway) |
| Last ned og les vedlegg i en meldingstråd (PDF/docx→tekst) |
| Last ned og les vedlegg i et oppslag/«Siste nytt» (PDF/docx→tekst) — her ligger ofte ukeplanen |
| «Siste nytt» / oppslag for et barn |
| Fravær for et barn |
| Samtykkeskjemaer (krever |
| Timeplan/ukesplan for en ISO-uke |
| Prøver/aktiviteter i timeplanen for en uke |
| Rått GET mot app- hhv. web-API-et — for kartlegging |
childId og organizationalUnitId får du fra web_list_children; begge er
UUID-er. week er ISO-format YYYY-WW (default inneværende uke).
Kartlagte web-endepunkter
Base https://web-parent.prod.vigilo-oas.no, alle GET, Bearer-auth:
/api/children/my— barn (childId +organizationalUnits)/api/news-feed?childIds=&fromDate=&toDate=/api/message-threads?childIds=&fromDate=&toDate=/api/absences?childIds=/api/consent-forms?childId=&organizationalUnitId=/api/students/{childId}/lessons?organizationalUnitId=&week=YYYY-WW/api/scheduling-events/{childId}/student?organizationalUnitId=&week=YYYY-WW/api/school-years?organizationalUnitId=
Videre arbeid
Vurderings-/karakter-endepunktet laster først etter valg av skoleår/termin i
Vurdering-fanen og er ikke kartlagt ennå — sniff det med web_api_get. Nye
endepunkter legges inn i client.py og eksponeres i server.py.
Available Tools
12 toolsabsencesD
Fravær for et barn.
Inputs: child_id (required). Returns: result
api_getA
Rått GET mot foreldre-API-et — for kartlegging av nye endepunkter.
path: f.eks. "/api/children". params_json: query-parametre som JSON-objekt; userId legges til automatisk om den ikke er satt. Returnerer status og body uansett utfall, så 404/400 også gir informasjon.
Inputs: path (required), params_json. Returns: result
consent_formsC
Samtykkeskjemaer for et barn (krever organizationalUnitId).
Inputs: child_id (required), organizational_unit_id (required). Returns: result
get_message_threadC
Hent alle meldingene i en tråd, inkl. vedleggs-URL-er.
Inputs: thread_uid (required). Returns: result
list_childrenB
List barna knyttet til den innloggede foresatte, med childId.
Inputs: no named parameters. Returns: result
list_message_threadsB
List beskjedtråder for et barn (bruk childId fra list_children).
Returnerer tråder med threadUid, tittel, avsender og tidspunkt.
Inputs: child_id (required), page_size. Returns: result
news_feedB
Oppslag/«Siste nytt» for et barn. Datoer YYYY-MM-DD (default: siste 30 dager).
Inputs: child_id (required), to_date, from_date. Returns: result
read_message_attachmentsA
Last ned og les vedleggene i en meldingstråd (f.eks. ukeplan-PDF).
Returnerer utdratt tekst per vedlegg. Bruk dette når en melding har vedlegg (hasAttachments/attachments) og du trenger innholdet — typisk ukeplanen med lekser, turer og «ta med»-beskjeder som ofte legges ved som PDF.
Inputs: thread_uid (required). Returns: result
scheduling_eventsC
Timeplan-hendelser (prøver, aktiviteter) for en ISO-uke ("YYYY-WW").
Inputs: child_id (required), organizational_unit_id (required), week. Returns: result
timetableC
Timeplan/ukesplan for en ISO-uke ("YYYY-WW", default inneværende uke).
Inputs: child_id (required), organizational_unit_id (required), week. Returns: result
web_api_getB
Rått GET mot web-foreldreportalen — for kartlegging av nye web-endepunkter.
path: f.eks. "/api/absences". params_json: query-parametre som JSON-objekt. Ingen userId legges til (web-API-et bruker childIds/organizationalUnitId). Returnerer status og body uansett utfall.
Inputs: path (required), params_json. Returns: result
web_list_childrenA
List barna med childId og organizationalUnitId (flatet ut).
organizationalUnitId (skole/klasse) trengs til timeplan, samtykke og vurdering; childId brukes overalt. Gir også skole- og gruppenavn.
Inputs: no named parameters. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
Two pairs of tools overlap significantly: list_children and web_list_children both list children (the latter is a superset), and api_get and web_api_get are both raw GET tools. Descriptions differentiate by API, but an agent may still misselect, especially since web_list_children provides more data.
Tool names mix noun-only (news_feed, absences, timetable), verb_noun (list_children, get_message_thread, read_message_attachments), and noun_verb (api_get, web_api_get) patterns. All are snake_case, but the structural inconsistency makes the set less predictable.
12 tools is well-scoped for a parent portal domain covering children, schedules, messages, and various school data. No tool feels redundant in count, and the raw GET tools add exploration capability without bloat.
The set covers core read operations: children, news, absences, consent, timetable, events, messages, and attachments. An assessment (vurdering) tool is mentioned as needed but missing, and there are no write operations, though the raw GET tools provide a workaround for missing read endpoints.
Maintenance
Related MCP Connectors
Ordrestyring MCP server for ChatGPT, Claude and any AI agent: create order, log hours, add material line, plan an employee, approve hours and create invoice draft in your own Ordrestyring account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Ordrestyring yourself; Cotlet does not store your password and you need no Ordrestyring API key. About the official Ordrestyring API: Ordrestyring has a GraphQL API and no official MCP server (checked 31 Oct 2026). The API key is not self-serve: you ask Ordrestyring support for it. Setup and FAQ: https://cotlet.dev/integrations/ordrestyring-api-mcp-server
Manage tickets, run agents and workflows, query tables, and search workspace knowledge.
Fiken MCP server for ChatGPT, Claude and any AI agent: create invoice, send invoice, book purchase, add contact and list unpaid invoices in your own Fiken account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Fiken yourself; Cotlet does not store your password and you need no Fiken API key. About the official Fiken API: Yes, Fiken has a documented REST API (v2) for invoices, sales, purchases, contacts, offers, credit notes and attachments (checked 14 Oct 2026), but it is a paid add-on: 99 NOK per month for a company registered in Brønnøysundregistrene. Apps that serve other companies must register an OAuth2 app, and Fiken publishes no MCP server of its own. Setup and FAQ: https://cotlet.dev/integrations/fiken-api-mcp-server
Skool MCP server for ChatGPT, Claude and any AI agent: list members, approve membership request, create post, reply to comment, send DM, get members, churn and MRR, create calendar event and add course lesson in your own Skool account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Skool yourself; Cotlet does not store your password and you need no Skool API key. About the official Skool API: Skool has no public API and no developer docs (checked 10 Oct 2026). The only official connection is the Zapier plugin on the Pro plan, which sends new paid members and Membership Questions answers out and can invite a member or unlock a course. Setup and FAQ: https://cotlet.dev/integrations/skool-api-mcp-server
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to securely access a guardian's SchoolSoft data—such as schedules, lunch menus, assignments, news, and subjects—using a BankID-authenticated session without exposing credentials.1MIT
- AlicenseNot gradedqualityBmaintenanceLets AI agents log in as a parent to ForældreIntra (SkoleIntra) and read news, messages, weekly plans, homework, documents, photos, contacts, and sign-ups as callable MCP tools. The server is read-only unless write tools are explicitly enabled.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to query and manage EduPage school accounts, including timetables, grades, homework, meals, messages, multi-school discovery, role-aware student switching, and 2FA login.3146 PyPI4MIT
- AlicenseAqualityCmaintenanceLets an AI agent read and manage a family's EduPage school data, including timetables, homework, grades, messages, absences, events, and canteen meals, and also send messages to teachers or order meals.161MIT