Skip to main content
Glama

schoolpass-mcp

MCP server for SchoolPass — read AND change your child's school arrival & dismissal from a parent account. Talks to the SchoolPass REST API used by the SchoolPass web and mobile apps, authenticating server-side with your own parent email and password (no browser, no extension).

Developed and maintained by AI (Claude Code). Use at your own discretion.

Parent-scoped: read tools plus a confirm-gated dismissal-change write/cancel.

Tools

Tool

What it does

schoolpass_healthcheck

Reachability + authentication, reported separately.

schoolpass_whoami

The parent identity the server signed in as.

schoolpass_list_students

Your linked students — name, grade, home dismissal location, aftercare.

schoolpass_get_profile

The parent account profile.

schoolpass_list_drivers

Authorized pickup drivers, with their carpools.

schoolpass_get_calendar

A student's arrival/dismissal calendar over a date range.

schoolpass_list_pickup_changes

Pickup/dismissal changes for a student on a date.

schoolpass_list_dismissal_locations

The school's dismissal locations, with ids.

schoolpass_get_school_info

Basic school info and per-school config.

schoolpass_submit_dismissal_change

Submit a dismissal/arrival change (confirm-gated, dry-run preview).

schoolpass_cancel_dismissal_change

Cancel a change, back to default (confirm-gated).

Related MCP server: alphaportal-mcp

Configuration

Env var

Required

Notes

SCHOOLPASS_EMAIL

yes

Your SchoolPass parent account email.

SCHOOLPASS_PASSWORD

yes

Your SchoolPass password.

SCHOOLPASS_SCHOOL_CODE

yes

The numeric school id (the AppCode / appCode value; e.g. 1183).

SCHOOLPASS_API_HOST

no

Regional API host override (default busapi-east16-ss.school-pass.net).

Finding your school id and region host: sign into your school's <school>.school-pass.net portal, open the new SchoolPass app, and read appCode (the id) and apiUrl (the host) from its browser localStorage.

Install

{
  "mcpServers": {
    "schoolpass": {
      "command": "npx",
      "args": ["-y", "schoolpass-mcp"],
      "env": {
        "SCHOOLPASS_EMAIL": "you@example.com",
        "SCHOOLPASS_PASSWORD": "your-password",
        "SCHOOLPASS_SCHOOL_CODE": "1183"
      }
    }
  }
}

Notes

  • Parent scope only. A parent token cannot reach admin routes (visitor management, carline operations, reports, bus routing); those return 403.

  • Never retry a rejected login. SchoolPass fronts its login with reCAPTCHA; repeated failures can get the account challenged.

  • No credentials, still boots. The server starts without configuration and answers tools/list; the config error surfaces on the first tool call.

Without the server: curl

The SchoolPass API is reachable server-side, so a one-off shell read needs no MCP process — see the bundled schoolpass-curl skill (skills/schoolpass-curl/) for a curl + jq recipe set.

Development

npm install
npm test            # tsc typecheck + unit + boot tests
npm run build       # tsc + esbuild bundle
node --env-file=.env scripts/live-check.mjs   # live read-only check (needs .env)

License

MIT

Available Tools

11 tools
schoolpass_cancel_dismissal_changeA

Cancel a previously-submitted dismissal/arrival change for a student on a date, returning that date to its default. CONFIRM-GATED: without confirm:true it looks up the change and returns a preview of what would be cancelled, making no change. With confirm:true it deletes the change and re-reads the calendar to confirm the day is back to default.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesThe date whose change should be cancelled (YYYY-MM-DD).
confirmNoMust be true to actually cancel. Without it, returns a preview only.
student_idYesStudent id (schoolpass_list_students).
change_series_idNoWhich change to cancel, when the date carries more than one. Get it from the student calendar (changeSeriesId) or from this tool's dry-run. Optional when the date has exactly one cancellable change.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false), the description discloses the two-phase behavior: without confirm it only previews and makes no change; with confirm it deletes and re-reads the calendar to verify the default state. This is rich, precise behavioral disclosure that significantly aids an agent. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with the main action and effect front-loaded, followed by the confirm-gate detail. It is concise, well-structured, and every word contributes to understanding. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a cancellation tool with a confirm gate and an optional change_series_id, the description explains the complete flow: preview vs. deletion, the condition for the optional parameter, and the post-deletion verification. No output schema exists, so return values need not be explained. The description is comprehensive for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with descriptions, including confirm's requirement and change_series_id's optionality. The description reinforces the confirm gate and the optionality condition but adds no new meaning beyond the schema. Baseline 3 is appropriate given full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (cancel), the target (previously-submitted dismissal/arrival change for a student on a date), and the outcome (returning the date to its default). It distinguishes itself from siblings like submit_dismissal_change and list_pickup_changes by focusing specifically on cancellation. The two-mode behavior (preview vs. confirmed) is also explicitly described.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage after submitting a change and explains the confirm gate requirement, which is essential. It does not explicitly name alternative tools or state when not to use it, but the context (cancelling a previously-submitted change) is clear enough for an agent to decide. The absence of explicit sibling comparison is a minor gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_get_calendarA
Read-onlyIdempotent

Get a student’s arrival & dismissal calendar over a date range — the per-day default and any changes. Requires a student id (from schoolpass_list_students). Defaults to today through 14 days out.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.
end_dateNoEnd of range (YYYY-MM-DD). Defaults to 14 days out.
start_dateNoStart of range (YYYY-MM-DD). Defaults to today.
student_idYesStudent id, from schoolpass_list_students.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and idempotent behavior; the description adds the data scope (per-day default plus changes) and default date boundaries. This is useful behavioral context, though it does not discuss open-world response caveats beyond the view parameter's schema text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the first states exactly what is returned and the second gives the prerequisite and default range. Key details are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given rich parameter descriptions, safe annotations, and a clear description of the response content, an agent can invoke this tool correctly. It would be slightly stronger with an explicit statement of when to prefer sibling list tools, but nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's mention of the student id source and date defaults mirrors what the input schema already states, adding little new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get a student’s arrival & dismissal calendar over a date range.' It also clarifies the output includes 'the per-day default and any changes,' which distinguishes it from sibling tools that list only pickup changes or profiles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly names the required prerequisite and its source ('Requires a student id (from schoolpass_list_students)') and gives sensible invocation defaults ('today through 14 days out'). It does not explicitly state when-not-to-use or compare against sibling tools, so it misses the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_get_profileB
Read-onlyIdempotent

Get the parent account profile (contact details and account settings) for the signed-in parent.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint, idempotentHint, and openWorldHint already present in annotations, the description does not need to restate safety behavior. It adds a useful scope ('for the signed-in parent') and content expectations, but it does not disclose error behavior, response envelope, or other operational traits beyond the annotations. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that packs the action, object, content, and scope without filler. It avoids duplicating schema details or annotation hints.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple optional-parameter read with read-only and idempotent annotations, the definition is largely self-sufficient: the schema fully documents the only parameter)Skip and the description clarifies the resource and scope. It lacks an explicit contrast with schoolpass_whoami and any detail on the response envelope, but these are not critical for making a correct first call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% parameter description coverage-newline including a detailed explanation of the view enum and its compact/full behavior. The tool description itself adds nothing about the parameter, but the schema already provides the necessary meaning, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource, 'Get the parent account profile', and clarifies the content with '(contact details and account settings)' and the scope 'for the signed-in parent'. It is clear about what the tool returns, though it does not explicitly distinguish itself from the sibling schoolpass_whoami, so agents must infer the boundary between identity and profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement about when to use this tool versus alternatives such as schoolpass_whoami or schoolpass_list_students. The phrase 'for the signed-in parent' implies a prerequisite, but it does not provide routing guidance, exclusions, or example scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_get_school_infoA
Read-onlyIdempotent

Get basic school info and per-school configuration (features enabled, dismissal windows, etc.) for the configured school.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful context by specifying what the response covers (features enabled, dismissal windows, etc.), but it does not disclose response shape, potential variability, or any operational behavior beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that immediately states the tool's purpose and key data contents. It is front-loaded and contains no filler or redundant repetition of the tool name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only info tool with one optional parameter and no output schema, the description gives sufficient context about what the caller will receive. The 'etc.' is slightly vague, but the examples (features enabled, dismissal windows) give a clear enough sense of scope for an agent to invoke it appropriately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single 'view' parameter is thoroughly documented in the schema itself. The description does not add parameter-level detail, but the baseline of 3 applies because the schema carries the full burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Get') and resource ('school info and per-school configuration'), giving immediate clarity about what the tool does. It also distinguishes itself from the sibling tools by referring to the configured school's general information rather than students, drivers, calendar, or dismissal changes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no direct guidance about when to use this tool versus alternatives. It implies usage through its purpose, but it does not state exclusions, prerequisites, or mention any sibling tool such as schoolpass_healthcheck or schoolpass_whoami.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_healthcheckA
Read-onlyIdempotent

Check SchoolPass connectivity and authentication. Reports whether the regional API host is reachable (an unauthenticated version probe) and, separately, whether the configured credentials log in — so a network problem is distinguishable from a bad password or school code.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=true, covering safety and repeatability. The description adds value by explaining the two-part behavior (unauth probe and credential login), which is not directly implied by the annotations. It doesn't contradict annotations and provides useful context about the checks performed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core action and purpose. It efficiently conveys the two checks and the rationale without unnecessary fluff. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters, no output schema, and annotations covering the safety profile, the description is complete. It explains what the tool does, why it's useful, and the distinction it provides. The agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema provides no parameter documentation. Per rubric, a tool with 0 parameters gets a baseline of 4. The description doesn't need to add parameter meaning since there are none, and it doesn't attempt to invent any.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Check') and resource ('SchoolPass connectivity and authentication'). It distinguishes two distinct aspects: an unauthenticated version probe for reachability and a credentials login check. This clearly differentiates it from sibling tools like schoolpass_whoami or schoolpass_list_students, which focus on specific data operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when needing to diagnose whether network issues versus credential problems are at play. It explicitly states the diagnostic value ('so a network problem is distinguishable from a bad password or school code'). However, it does not name alternatives or explicitly state when not to use this tool, though the context is clear enough for an agent to infer its diagnostic role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_list_dismissal_locationsA
Read-onlyIdempotent

List the school’s dismissal locations (car line, bus, aftercare, walkers, etc.) with their ids — the vocabulary a dismissal change refers to.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds the behavioral context that the result serves as the reference vocabulary for dismissal changes, which is valuable beyond the annotations. It also confirms the output includes ids, giving a hint about the return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the core purpose, followed by a clarifying clause about its role in dismissal changes. Every word earns its place; no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no output schema, the description conveys the essential facts: it lists locations and their ids, and it is the vocabulary for dismissal changes. It does not specify the exact response structure, but given the simplicity and the annotations, this is sufficient. It could mention if it returns only active locations, but that is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'view' is fully documented in the input schema with a detailed description of compact vs full behavior. Schema coverage is 100%, so the description does not need to repeat parameter details. The tool description adds nothing about parameters, but the schema carries the load, meeting the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List) and resource (dismissal locations), and clarifies the output includes ids. It also explicitly ties the tool to the dismissal-change vocabulary, distinguishing it from sibling list tools like list_students or list_drivers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by stating 'the vocabulary a dismissal change refers to', which signals it should be used before submitting or canceling a dismissal change. However, it doesn't explicitly state when not to use it or name alternatives, leaving some inference needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_list_driversA
Read-onlyIdempotent

List the authorized pickup drivers registered on the parent account, optionally including the carpools each belongs to.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the description carries a lighter burden. It adds the detail that carpools may be optionally included, which is a response-content feature rather than a behavioral trait. It does not disclose additional side effects, error conditions, or upstream variability beyond what the annotations already imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that starts with the verb and resource, mentions the optional carpools feature, and contains no unnecessary words. It is front-loaded and perfectly concise for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter fully described in the schema, an open-world annotation, and no output schema, the description is adequate for correct invocation: it names the resource and optional carpools. It does not enumerate return fields or prerequisites, but these are not necessary given the tool's simplicity and existing annotation coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides a thorough description of the 'view' parameter, including enum values and response-shape implications (100% coverage). The tool description's mention of carpools is only loosely connected to the parameter and does not explicitly map to 'compact' or 'full'. Thus the description adds minimal semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('List') on a specific resource ('authorized pickup drivers registered on the parent account'). It also distinguishes this from sibling tools like list_students and list_pickup_changes by naming the exact resource, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus sibling tools such as list_students or list_pickup_changes, nor any exclusions or prerequisites. It only states what the tool does, leaving the agent to infer when it should be invoked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_list_pickup_changesA
Read-onlyIdempotent

List pickup / dismissal changes for a student on a given date (defaults to today) — early pickups, late arrivals, carpool moves, and the like. Requires a student id.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate (YYYY-MM-DD). Defaults to today.
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.
student_idYesStudent id, from schoolpass_list_students.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description does not need to disclose those. It adds the default-to-today behavior and lists example change types, which provide context beyond annotations. However, most of this is also present in the schema (default date, id requirement), so the incremental behavioral info is modest. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, packed sentence with no fluff. It front-loads the main purpose and essential requirements, and the example list is valuable. It is slightly dense but appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing tool with three well-documented parameters and powerful annotations (readOnlyHint, idempotentHint), the description is complete enough to invoke correctly. It mentions the default date and required id, and while it doesn't detail the response shape or the 'view' parameter, those are covered by the schema and the readOnly annotation implies a list result. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter already described (student_id source, date format and default, view enum). The description adds no additional semantic detail beyond restating the default date and required student id. Per instructions, baseline of 3 applies when schema covers everything, and no compensation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'pickup / dismissal changes for a student on a given date', and enumerates examples (early pickups, late arrivals, carpool moves) which distinguishes it from sibling tools like submit_dismissal_change and list_dismissal_locations. It also notes the required student id, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus siblings. It does not state 'use this to view changes, not to create them' or contrast with submit/cancel dismissal change tools. It only mentions 'Requires a student id' as a prerequisite, which is already in the schema, so there is no added routing information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_list_studentsA
Read-onlyIdempotent

List the students linked to the parent account: name, grade, home dismissal location, aftercare flag, and per-student details. Defaults to the signed-in parent.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering the safety profile. The description adds a useful behavioral detail: it defaults to the signed-in parent. It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one efficient sentence that front-loads the core action and key result fields. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional parameter, the description gives the essential result fields and a key default behavior. There is no output schema, but the listed fields provide enough context for an agent to understand what will be returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter is fully documented in the schema, including its enum and detailed explanation of compact vs. full response shapes. The description adds no parameter information, but the schema carries the burden, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list students linked to the parent account, and names the returned fields. It clearly identifies what the tool does, though it does not explicitly contrast it with sibling tools like schoolpass_list_drivers or schoolpass_list_pickup_changes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied by the description: call this when you need a parent's linked students and their details. However, it gives no explicit guidance about when to prefer this over sibling tools or any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_submit_dismissal_changeA

Submit a dismissal/arrival change for a student on a single date — send them to a different dismissal location or carpool, mark early dismissal / late arrival / absent, etc. CONFIRM-GATED: without confirm:true it makes no change and returns a dry-run preview of the exact request. With confirm:true it submits and then re-reads the calendar to show the change landed. Get student_id from schoolpass_list_students and move_to_id from schoolpass_list_dismissal_locations (a dismissal location id) or the student calendar (a carpool moveToId).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesThe date to change (YYYY-MM-DD).
notesNoOptional note attached to the change.
ad_typeNoWhich side of the day: arrival, departure (default), or both.departure
confirmNoMust be true to actually submit. Without it, returns a dry-run preview only.
move_to_idNoTarget dismissal location id (schoolpass_list_dismissal_locations) or carpool id. Required for carpool and bus moves (enforced); supply it for activity/location moves too.
student_idYesStudent id (schoolpass_list_students).
bus_stop_idNoBus stop id for a bus move. The app sends this field on every submit, but no bus change has been captured live, so its effect is UNVERIFIED — see docs/SCHOOLPASS-API.md.
change_typeYesThe kind of change.
time_of_dayNoOptional time of day for the change (e.g. "14:30").
will_returnNoWhether the student will return the same day (for early dismissal).
pickup_dropoff_personNoOptional name of the person picking up / dropping off.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint:false, openWorldHint:true), the description explains the confirm gate, the no-op dry-run behavior, and the post-submit re-read of the calendar to verify the change landed. This is meaningful behavioral context about side effects and verification, and it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loads the core action, then gives the confirm-gate behavior and ID sourcing. No sentence is filler; the 'etc.' enumerates scope without bloating the text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, no-output-schema mutation tool, it is complete enough: core action, change types, safety gate, verification behavior, and ID lookup dependencies are all present. The schema handles remaining parameter-level details, and the returned behavior is described (dry-run preview vs calendar re-read).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the baseline is 3, and the description adds a useful cross-tool sourcing rule: student_id from schoolpass_list_students and move_to_id from schoolpass_list_dismissal_locations, or a carpool moveToId from the student calendar. The confirm and move_to_id semantics are mostly restated from the schema, so the added value is moderate but real.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and object—'Submit a dismissal/arrival change for a student on a single date'—and enumerates concrete change types such as different location/carpool, early dismissal, late arrival, and absent. It is semantically distinct from the sibling schoolpass_cancel_dismissal_change, so an agent can identify this tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when dry-run vs actual submission occurs ('without confirm:true... returns a dry-run preview... With confirm:true... submits'), which tells the agent how to safely explore. It also gives data-dependency guidance by pointing to schoolpass_list_students and schoolpass_list_dismissal_locations as sources for IDs. It does not explicitly name exclusions relative to the cancellation sibling, but the submit/cancel split is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schoolpass_whoamiA
Read-onlyIdempotent

Return the parent account this server is signed in as: member id, user type, and name. Runs the login bootstrap if it has not run yet.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnly, idempotent, and openWorld hints, and the description does not contradict them. It adds meaningful behavioral context by disclosing that it may run the login bootstrap on first use, which an agent would not infer from the schema alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences: the first states what is returned, and the second discloses the bootstrap side effect. No filler, no repetition of schema data, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only identity tool, the description is complete: it names the returned fields, references the authentication context, and covers the only relevant behavioral nuance (login bootstrap). The lack of an output schema is mitigated because the return values are explicitly listed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4 and there is no parameter-description burden to meet. The description wisely focuses on return contents rather than inventing unnecessary parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly names the verb ('Return'), the resource ('the parent account this server is signed in as'), and the exact payload fields (member id, user type, name). This distinguishes it from siblings like get_profile or list_students, since it specifically targets the server's current authenticated identity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context is clear: this is the tool to call when you need the server's signed-in parent identity. It also hints at a bootstrap behavior ('Runs the login bootstrap if it has not run yet'), which gives useful sequencing context. However, it does not explicitly state when not to use it or mention an alternative sibling.

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.

  1. 11 tool updatesv1.0.0
    • Changedschoolpass_cancel_dismissal_change1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_get_calendar1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_get_profile1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_get_school_info1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_healthcheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_list_dismissal_locations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_list_drivers1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_list_pickup_changes1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_list_students1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_submit_dismissal_change1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedschoolpass_whoami1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 7 tool updatesv0.4.2
    • Changedschoolpass_get_calendar1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedschoolpass_get_profile1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedschoolpass_get_school_info1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedschoolpass_list_dismissal_locations1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedschoolpass_list_drivers1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedschoolpass_list_pickup_changes1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedschoolpass_list_students1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns SchoolPass's payload untouched. No field projection: this server has no verified record of which SchoolPass fields matter, and inventing one would risk dropping a field a caller needs.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
  3. 2 tool updatesv0.3.1
    • Changedschoolpass_cancel_dismissal_change1 field changed
      • addedInput schema / properties / change_series_id
        Added value: +{
        +  "description": "Which change to cancel, when the date carries more than one. Get it from the student calendar (changeSeriesId) or from this tool's dry-run. Optional when the date has exactly one cancellable change.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
    • Changedschoolpass_submit_dismissal_change2 fields changed
      • addedInput schema / properties / bus_stop_id
        Added value: +{
        +  "description": "Bus stop id for a bus move. The app sends this field on every submit, but no bus change has been captured live, so its effect is UNVERIFIED — see docs/SCHOOLPASS-API.md.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedInput schema / properties / move_to_id / description
        Previous value: -"Target dismissal location id (schoolpass_list_dismissal_locations) or carpool id. Required for carpool/bus/location moves."New value: +"Target dismissal location id (schoolpass_list_dismissal_locations) or carpool id. Required for carpool and bus moves (enforced); supply it for activity/location moves too."
  4. 11 tool updatesv0.2.0
    • First observedschoolpass_cancel_dismissal_change
    • First observedschoolpass_get_calendar
    • First observedschoolpass_get_profile
    • First observedschoolpass_get_school_info
    • First observedschoolpass_healthcheck
    • First observedschoolpass_list_dismissal_locations
    • First observedschoolpass_list_drivers
    • First observedschoolpass_list_pickup_changes
    • First observedschoolpass_list_students
    • First observedschoolpass_submit_dismissal_change
    • First observedschoolpass_whoami

TDQS

A4.1/5.0

Scored across 11 tools

Disambiguation5/5

Each tool addresses a distinct resource or action: health/identity checks, account and student lookups, calendar and change listing, dismissal-location vocabulary, and submit/cancel mutations. Even the account-related tools are cleanly separated by purpose, so there is no realistic ambiguity.

Naming Consistency4/5

The vast majority of tools follow a consistent schoolpass_<verb>_<noun> pattern like list_students, get_calendar, and submit_dismissal_change. The exceptions are healthcheck and whoami, which are conventional but do not match the verb_noun pattern.

Tool Count5/5

With 11 tools, the server is well-scoped for the SchoolPass parent domain: a few meta/auth tools, read-only lookups, supporting vocabulary/config tools, and gated mutation tools. Each tool earns its place without redundancy.

Completeness5/5

The server covers the core dismissal/arrival change lifecycle end to end: list students and locations, read calendars and existing changes, submit changes with dry-run confirmation, and cancel them. Supporting account, driver, and school-config lookups round out the surface with no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers