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 Serverread 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: edookit-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.
| Name | Required | Description | Default |
|---|---|---|---|
| child_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 of behavioral disclosure, and it discloses nothing: not whether this is a read or write, whether authentication/consent is required (notably relevant given the sibling 'consent_forms'), nor any scoping or rate-limit behavior.
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?
It is a single short sentence with no padding, which is structurally clean, but the brevity reflects under-specification rather than effective conciseness. There is no front-loaded verb or actionable 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?
With only one required parameter and an output schema present, the tool is simple enough that return values need not be described. Still, the description omits the operation type and any context, leaving the agent guessing what calling it actually does.
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 0% for the single parameter child_id. The parameter name is fairly self-explanatory, but the description adds no meaning at all — it does not say whether the ID is a UUID, external identifier, or reference, nor what 'absence' means for that child.
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 'Fravær for et barn' (absences for a child) merely restates the tool name plus a scope modifier. It contains no verb (list? create? query?) and gives no indication of what operation is performed on the absences, so an agent cannot distinguish its purpose from sibling tools like list_children or scheduling_events.
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?
There is no guidance whatsoever on when to use this tool versus alternatives such as web_list_children or scheduling_events, no prerequisites, and no exclusions. The agent is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| params_json | No | {} |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and does add real behavioral context: userId is injected automatically when absent, and status plus body are returned regardless of outcome so 404/400 are still informative. It does not mention authentication requirements, rate limits, or whether the raw call can be truncated, but for a passthrough GET wrapper the disclosure is substantial.
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?
Two tight sentences: purpose and intended usage first, then per-parameter meaning and return behavior. Every clause carries information, and the example path is front-loaded for quick scanning.
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?
An output schema exists, so return structure need not be restated, and the description still usefully notes that errors return status+body. The main completeness gap is the absence of any contrast with the nearly identical sibling web_api_get, which matters for a raw-passthrough tool in a family of API wrappers.
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 0%, so the description must compensate, and it does: path is given a concrete example and params_json is explained as a JSON object of query parameters with an implicit userId injected when unset. That is meaningful semantics beyond the bare "string" schema, though the JSON encoding/escaping of params_json is not spelled out.
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?
States a specific verb and resource: a raw GET against the parent API, explicitly framed for probing/discovering new endpoints, with a concrete path example ("/api/children"). It is clear on its own, but it never distinguishes itself from the sibling web_api_get, which appears to do something very similar.
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 kartlegging av nye endepunkter" gives an implied use case (endpoint exploration rather than routine data fetching). However, there is no explicit when-to-use/when-not, no prerequisites, and no naming of the alternative web_api_get, leaving the agent to guess which of the two GET wrappers to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consent_formsC
Samtykkeskjemaer for et barn (krever organizationalUnitId).
| Name | Required | Description | Default |
|---|---|---|---|
| child_id | Yes | ||
| organizational_unit_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 of behavioral disclosure, and it meets almost none of it: no read/write indication, no permission or scoping behavior, no pagination or rate-limit notes. The single prerequisite hint is already visible in the schema's required list.
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?
A single short sentence with no filler, and the prerequisite is front-loaded in parentheses. It is not padded or redundant, though it is too thin to be exemplary.
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?
An output schema exists, so return values need not be described, and the tool has only two required parameters. Still, the definition never states the operation being performed, leaving the core question an agent must answer before calling it unresolved.
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 0%, so the description must compensate, but it only names organizationalUnitId (and even then in a different casing than the schema's organizational_unit_id). child_id is never explained, and no parameter's meaning, format, or relationship is clarified beyond the schema.
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 names a resource ('Samtykkeskjemaer for et barn' / consent forms for a child) but supplies no verb, so it is ambiguous whether the tool lists, fetches, or creates consent forms. It is more informative than a tautology and roughly distinguishes the topic from siblings like absences or timetable, but the action is left to inference.
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 only guidance is the parenthetical note that organizationalUnitId is required, which merely restates a required field already declared in the schema. There is no statement of when to use this tool, when not to, or which sibling to prefer for related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_message_threadC
Hent alle meldingene i en tråd, inkl. vedleggs-URL-er.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_uid | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full behavioral burden. It mentions attachment URLs are included, which is useful, but says nothing about permissions, pagination, read-only status, error behavior, or whether the thread must exist. For a retrieval tool with no annotations, this is a significant gap.
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 short sentence with no wasted words, but it is arguably too minimal to be helpful. It is front-loaded and efficient, but lacks necessary 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?
With an output schema present, the description needn't explain return values, but it does mention attachment URLs, which is a helpful pointer. However, for a 1-parameter tool with no annotations, the description should at least state that it is a read operation and what the thread_uid refers to. It is moderately complete but leaves notable 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 description coverage is 0%, but there is only one parameter (thread_uid) and its type is clear. The description implies the parameter is a thread identifier, which is the bare minimum. However, it does not explain the format, source, or constraints of thread_uid, so it adds little beyond the schema's name.
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?
States a specific verb ('hent' / retrieve) and resource ('alle meldingene i en tråd' / all messages in a thread), and clarifies it includes attachment URLs. This clearly distinguishes it from siblings like list_message_threads and read_message_attachments, though the description is only one sentence.
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?
No explicit guidance on when to use this tool vs alternatives. Sibling names like list_message_threads suggest a possible confusion, but the description offers no routing information, conditions, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_childrenB
List barna knyttet til den innloggede foresatte, med childId.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It does not disclose read-only nature, authentication requirements, rate limits, or output format, though the output schema exists and may cover return values. The mention of 'logged-in' implies an auth context but is not a behavioral disclosure.
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, short sentence that front-loads the core purpose. It is concise, though the mixed language (Norwegian/English) may reduce clarity for some agents.
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 that there are no parameters and an output schema exists, the description may be sufficient for calling the tool. However, without annotations, it lacks any behavioral context such as safety or auth requirements, leaving some gaps for an agent to infer.
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 parameter semantics are not applicable. The description still mentions childId as a returned field, which is a minor addition. Baseline 4 is appropriate for a zero-param tool.
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 states a specific verb and resource: listing children associated with the logged-in guardian, and mentions the childId. It doesn't explicitly differentiate from the sibling web_list_children, which appears to be a near-duplicate, but the purpose itself is clear.
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?
There is no guidance on when to use this tool versus the similar web_list_children sibling. The description implies a context (logged-in guardian) but provides no exclusions or alternative selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_message_threadsB
List beskjedtråder for et barn (bruk childId fra list_children).
Returnerer tråder med threadUid, tittel, avsender og tidspunkt.
| Name | Required | Description | Default |
|---|---|---|---|
| child_id | Yes | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It mentions what is returned at a high level (threadUid, title, sender, timestamp), which is useful, but omits critical traits like pagination behavior, permissions required, whether it's read-only, and what can go wrong. For a list tool with no annotations, this is a significant gap.
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?
Two sentences, front-loaded with the primary purpose, followed by return field details. No filler. Could be slightly more compact, but it is efficient and well-structured.
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 list tool with no annotations and no schema descriptions, the description provides the core purpose and return fields. However, it lacks pagination details (especially relevant given the page_size parameter) and doesn't cover behavioral aspects like permissions or rate limits. An output schema exists, so return values need not be fully explained, but the description still feels incomplete for safe and correct invocation.
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 0%, with 2 parameters (child_id required, page_size with default). The description does add value by explaining that child_id should come from list_children, which is not in the schema. However, it says nothing about page_size or pagination, leaving half the parameters undocumented. Partial compensation justifies a 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?
States a specific verb and resource: 'List beskjedtråder for et barn' (message threads for a child). It distinguishes itself from siblings like get_message_thread (singular) and list_children, though it doesn't name any alternative explicitly. The purpose is clear despite being in Norwegian.
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?
Implied usage: it references list_children as the source of childId, which is helpful context. However, it doesn't state when to use this tool versus get_message_thread or read_message_attachments. No explicit exclusions or alternative scenarios are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
news_feedB
Oppslag/«Siste nytt» for et barn. Datoer YYYY-MM-DD (default: siste 30 dager).
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | No | ||
| child_id | Yes | ||
| from_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries full behavioral burden. It discloses the default date range (last 30 days) and date format (YYYY-MM-DD), which is useful. It does not state whether this is read-only, permissions needed, pagination, or anything about the feed contents.
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?
Extremely concise, front-loads the resource, then the date semantics. Nothing is wasted, though the brevity leaves gaps elsewhere.
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?
Output schema exists, so return values needn't be described. However, with no annotations and 0% schema coverage, the description should say more about what the feed contains and how child_id scopes results. It covers defaults but not enough for a complete picture.
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 is 0%, so the description must compensate. It adds meaning for from_date/to_date (date format and default) but says nothing about the required child_id. Partial compensation for a 3-parameter schema.
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?
States a specific resource ('Oppslag/«Siste nytt» for et barn' – a news feed for a child) with a clear read scope. It doesn't differentiate from siblings like list_message_threads or get_message_thread, but the resource is distinct enough.
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?
No when-to-use guidance and no reference to alternatives. The only contextual hint is the default 30-day window, which is usage context but not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_uid | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that attachments are downloaded and text is extracted per attachment, implying a read operation, but says nothing about permissions, rate limits, failure modes for unsupported file types, or any side effects of downloading.
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?
Front-loaded with the action and resource, then the return value and usage condition. Efficient and free of filler, with only the concrete example adding modest length.
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?
An output schema exists, so return values needn't be documented, yet the description helpfully states text-per-attachment output. For a simple one-parameter read tool the description is largely complete, its main omission being thread_uid provenance and edge-case behavior.
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 0%, so the single thread_uid parameter is undocumented. The description implies it identifies the message thread but adds no format, source, or how to obtain it (e.g. from list_message_threads/get_message_thread), leaving a real gap the schema does not fill.
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?
States a specific verb (download and read) and resource (attachments in a message thread), plus what is returned (extracted text per attachment). It is distinguishable from sibling list/get message tools, though it does not explicitly name an alternative.
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?
Gives a clear condition for use: when a message has attachments (hasAttachments/attachments) and the content is needed, with a concrete example (ukeplan PDF). No explicit when-not or named alternative, but the trigger is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scheduling_eventsC
Timeplan-hendelser (prøver, aktiviteter) for en ISO-uke ("YYYY-WW").
| Name | Required | Description | Default |
|---|---|---|---|
| week | No | ||
| child_id | Yes | ||
| organizational_unit_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing about safety, permissions, pagination, or whether the operation is read-only (only the noun phrase implies a read). An output schema exists, which relieves it of explaining return values, but for a tool with zero annotation coverage this leaves a significant gap.
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?
A single short sentence with no filler, and the scope constraint is placed after the resource. It is efficient, but the brevity here reflects under-specification rather than economy of expression.
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?
With 3 parameters, a required-parameter pair, and overlapping siblings, the definition is too thin: it omits read/write direction, usage boundaries versus 'timetable', and semantics for both required IDs. The existing output schema covers return values, but that alone does not make the definition complete.
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 0%, so the description must compensate and it only partly does: it clarifies the format of the optional 'week' parameter ('YYYY-WW'), which the schema does not. The two required parameters, 'child_id' and 'organizational_unit_id', receive no semantic explanation in either place, leaving required inputs under-specified.
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 names the resource clearly and even parenthesizes its contents ('prøver, aktiviteter') plus the scope key ('for en ISO-uke'). However there is no verb, so it is ambiguous whether this reads or writes schedule events, and it gives no signal to distinguish it from the overlapping sibling 'timetable'. Purpose is inferable but not sharply differentiated.
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?
There is no when-to-use guidance, no exclusions, and no mention of alternatives, despite 'timetable' and 'absences' being plausible competing tools for calendar-like data. The agent must infer usage purely from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timetableC
Timeplan/ukesplan for en ISO-uke ("YYYY-WW", default inneværende uke).
| Name | Required | Description | Default |
|---|---|---|---|
| week | No | ||
| child_id | Yes | ||
| organizational_unit_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: no auth/permission requirements, no indication of whose timetable is returned (which child context is required), and no mention of caching, rate limits, or scope of data. The presence of an output schema covers the return shape, but the operational behavior remains opaque.
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?
A single short sentence with the resource front-loaded and the week format appended efficiently; nothing is wasted. It borders on under-specification rather than being too long, but by the conciseness measure it is tight.
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 tool with two required identifiers, zero annotation coverage, and zero schema descriptions, the description is not complete enough to call it correctly — it never explains whose timetable the child_id and organizational_unit_id resolve, nor any scope or permission constraints. The output schema does relieve the description of explaining return values, which prevents a 1.
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 0%, so the description must compensate. It does add real meaning for the week parameter — the "YYYY-WW" format and the current-week default — but says nothing about the two required parameters (child_id, organizational_unit_id), leaving them entirely undocumented.
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 names a specific resource ("Timeplan/ukesplan") and its scope (an ISO week), which separates it from siblings like absences or scheduling_events. It is a noun phrase rather than an explicit verb, so it reads more like a return-value label than an action, but the intent is still clear.
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?
There is no statement of when to use this tool versus the siblings (absences, scheduling_events, news_feed), nor any prerequisite or eligibility condition. The only guidance is the week default, which is a parameter detail rather than usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| params_json | No | {} |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses two important traits: no userId is added (web API uses childIds/organizationalUnitId) and returns status and body regardless of outcome. But it omits auth requirements, rate limits, error handling specifics, and mutation safety (though GET implies read-only). Adequate but incomplete for a raw API call tool.
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?
Front-loads purpose, then provides concise parameter examples and key behavioral note. No wasted words; three short lines efficiently cover the essentials. Slightly terse but appropriate for a low-level API tool.
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?
Output schema exists, so return values need not be explained. However, as a raw GET tool with no annotations and 0% schema coverage, the description should clarify auth context (what credentials are used) and any rate limits or pagination. It covers parameter examples and one behavioral trait but leaves out important operational context.
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 0%, so description must compensate. It provides examples for both parameters ('/api/absences' for path, JSON object for params_json) and clarifies that no userId is automatically added. This adds meaningful syntax meaning beyond empty schema descriptions, but lacks detail on params_json format specifics or error cases.
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?
States a specific verb (GET) and resource (web-foreldreportalen API), and clarifies it is a raw GET for mapping new web endpoints. Distinguishes itself from api_get by being 'web' portal specific, though the distinction is somewhat implicit rather than explicit.
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?
Implies usage for 'kartlegging av nye web-endepunkter' (mapping new web endpoints), which suggests exploratory/discovery use. However, it does not explicitly contrast with sibling api_get or state when not to use this tool. No prerequisites or alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does add useful output context ('flatet ut', includes school and group names), but it does not state read-only/authentication behavior, pagination, or other operational traits. Given the output schema exists, return details are partly covered elsewhere.
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 short and front-loads the main action: listing children with key identifiers. The remaining sentences add relevant field and usage context without excessive repetition, though the phrasing is slightly fragmented.
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 zero-parameter list tool with an output schema, the description covers the core purpose and returned identifiers. Still, with no annotations and an existing sibling named list_children, the definition does not resolve tool-selection ambiguity or provide enough operational context for confident invocation.
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 input parameters, so there are no parameter semantics to document and the baseline is 4. The description mentions childId and organizationalUnitId, but these appear to be output fields rather than call arguments.
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 states a specific verb and resource: listing children with childId and organizationalUnitId, flattened, and returning school/group names. However, it does not distinguish this tool from the sibling list_children, leaving the agent unsure which list tool to choose.
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?
It provides implied usage context by noting that organizationalUnitId is needed for timetable, consent, and assessment, while childId is used everywhere. But it gives no explicit when-to-use guidance, prerequisites, or comparison against the sibling list_children.
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.
12 tool updates
v0.1.0- First observed
absences - First observed
api_get - First observed
consent_forms - First observed
get_message_thread - First observed
list_children - First observed
list_message_threads - First observed
news_feed - First observed
read_message_attachments - First observed
scheduling_events - First observed
timetable - First observed
web_api_get - First observed
web_list_children
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
Compliance infrastructure API connecting AI agents to Norwegian government systems (Altinn, BRREG).
Agent knowledge, private memory and coordination. Connect with MCP OAuth or an agent key.
Manage Microsoft 365 email, calendar, contacts and inbox rules via the Graph API with OAuth 2.0.
Unofficial NTNU course data: search, timetables, grades, course info, and exam logistics.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables accessing IServ school platform features such as timetable, exercises, messenger, and more via natural language, without exposing credentials to agents.1MIT
- FlicenseCqualityCmaintenanceEnables interaction with the Edookit school management system API, exposing attendance, lessons, people, grades, payments, courses, timetable, and individual goals as MCP tools.46-
- FlicenseNot gradedqualityBmaintenanceConnects AI agents to the École Directe API to access grades, homework, timetables, school life, messages, and documents.-
- 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.MIT