unw-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| UNW_AUTO_LOGIN | No | Set to 0 to guarantee no command starts a browser login. | |
| PYTHONUNBUFFERED | No | Set to 1 to keep Python output unbuffered, as shown in the MCP registration example. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
UNW planner: Degree Works audit + Banner 9 class search + planning tools.
START HERE
Call unw_session() first. If authenticated=false, try one read tool (unw_profile/unw_terms); reads may work when degraded. Stop only on auth/session errors or before a write, then use fix_command; never improvise a login.
Then unw_profile() and unw_remaining(). The audit already knows the student's majors, minors, catalog year, classifications and advisors: never ask the student for facts the audit can answer.
DO confirm declared programs against what the student says. They diverge often (e.g. a student says "ministry minor" while the audit says "Bible"). Report the discrepancy, do not silently pick one.
ASK BEFORE ASSUMING
Credit budget, blocked days/times, earliest start, latest end, summer willingness, and graduation target. unw_roadmap and unw_plan_draft have defaults; defaults are not the student's preferences.
PLANNING ORDER
Scarce major-required courses first. Check unw_offering_matrix before proposing any course: never propose a fall-only course for spring (or vice versa).
Then the major credit pool / electives.
Then gen-ed slots, choosing the highest RMP rating among eligible sections.
Never propose two sections with a time conflict. Use unw_conflicts on the final CRN set and show the ASCII grid.
Flag NOT_YET_OPEN / CLOSED sections, single-section courses, unassigned faculty ("Staff"), and variable-credit rows. Seats are a 15-minute snapshot.
RATINGS
Unrated is unknown, not bad: null is never 0.0. Prefer rated instructors but say when the evidence is thin (n<3 is weak). Match confidence reflects name ambiguity, not teaching quality.
BANNER PLANS (term-scoped)
Plans belong to one term. unw_banner_plans(term) returning [] means "no plans for THIS term", not "no plans exist". Other terms' plans are invisible.
Confirmation is ENFORCED by the server, not advisory. Every write tool requires confirm=true; unw_banner_plan_delete also requires confirm_name equal to the plan's exact name. Calling without them returns refused=true, the intended effect and the current plan state, and performs no write.
Still show that intended effect to the user and get explicit approval before re-calling with confirmation. Add/remove need a plan id or exact name; ambiguous names are rejected with candidates, never guessed.
Every successful write returns a read-back before/after diff (rows, credits). Report it.
Do not create/delete plans just to test something: the student's plans are real.
REGISTRATION
unw_register_preview is a DRY RUN. It never POSTs add/drop/register. Use unw_registration_window for time tickets; report Banner's eligibility failure text verbatim instead of implying registration can proceed.
OUTPUT
Always show the ASCII grid and a one-line rationale per pick. Report discrepancies (already-completed course, requirement the plan drops, audit vs catalog conflicts) instead of quietly resolving them.
CACHING
Term snapshots are cached for 15 minutes. Pass refresh=true only when the user needs current seats. unw_offering_matrix reads historical snapshots and is the right tool for "can this course be taken next term?".
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| unw_sessionA | Check the UNW session: |
| unw_profileB | Student profile from Degree Works: name, id, classification, degree/school, catalog year(s), majors, minors, programs, college, advisors, credits earned and in progress, GPA, percent complete, anticipated graduation, academic standing and holds. Holds are not exposed by the mapped APIs: null = unknown. |
| unw_auditB | Structured degree-audit requirement tree (groups -> blocks -> course
options, with applied/in-progress/transfer flags). |
| unw_remainingA | Unmet requirements only: id, title, parent group, kind, credits remaining,
pick-N progress, course/attribute/wildcard options, status, priority class and
|
| unw_termsA | Banner term codes with descriptions plus is_next, is_current, view_only and registration_eligible flags. Eligibility is probed through Banner's own mode=registration response (cached per process); refresh=True re-probes it. Failures are included verbatim. |
| unw_searchA | Search one term's sections (normalised rows: CRN, course, title, credits,
seats, days/times, faculty, attributes, availability). Banner ignores the
attribute/instructor/open-only query parameters, so filtering happens
client-side over a cached term snapshot. |
| unw_courseB | Full detail for one CRN: meetings, faculty with RMP evidence, attributes, catalog description, prerequisite/corequisite/restriction text plus the parsed prerequisite codes, linked lecture/lab CRNs, enrollment text and availability. |
| unw_candidatesA | Resolve unmet requirements to sections offered in |
| unw_ratingsA | Batch Rate My Professors lookup. Accepts "Last, First" or "First Last".
Unrated professors return rating=null (never 0.0); weak_evidence flags n<3.
Cache entries expire after 7 days; |
| unw_conflictsB | Pairwise time conflicts for a CRN set, plus the ASCII week grid and the list of unscheduled (TBA/asynchronous) sections. Half-open intervals; linked lecture/lab pairs are exempt. |
| unw_plan_draftA | Draft a conflict-free term plan from the audit, prioritizing major-required courses, then major pools, then gen-ed by RMP rating.
|
| unw_roadmapA | Multi-term plan starting at |
| unw_offering_matrixA | Offering pattern per course/attribute across every observed term: every-term, fall-only, spring-only, summer-only or never observed, with section counts, open counts and instructors per term. Accepts "CYS 4245", "ATTRIBUTE NATS" or "DAL *". Omit courses for every unmet requirement target. Use this before proposing a course for a future term. |
| unw_banner_plansA | List the student's Banner Plan Ahead worksheets for one term. Plans are
TERM-SCOPED: this list only contains plans whose planHeader.term equals
|
| unw_banner_plan_createA | Create a named Banner Plan Ahead worksheet for Confirmation is ENFORCED, not advisory: |
| unw_banner_plan_addA | Add a section (crn) or a course (subject+number) to a Banner plan (writes to Banner). Confirmation is ENFORCED: |
| unw_banner_plan_removeA | Remove one course row from a Banner plan (writes to Banner). Confirmation is ENFORCED: |
| unw_banner_plan_deleteA | Delete an entire Banner plan (writes to Banner, irreversible). Confirmation is ENFORCED twice: |
| unw_register_previewA | DRY RUN ONLY: never posts add/drop/register. Returns Banner's real term
eligibility flags and failure text for |
| unw_registration_windowA | READ-ONLY registration time-ticket window(s). With |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 20 tools
Most tools target a clearly distinct resource or action, and the descriptions explicitly draw boundaries where overlap exists (unw_audit vs unw_remaining is 'authoritative what-is-left', unw_search vs unw_candidates is 'wraps the resolver', unw_plan_draft vs unw_roadmap is 'single-term with pins vs multi-term'). The remaining soft overlaps — unw_register_preview re-checking seats/conflicts/prereqs that unw_search and unw_conflicts already surface, and unw_banner_plans vs the local draft tools — are workable but could still cause misselection.
Nearly all names share the unw_ prefix and snake_case noun-oriented pattern, with the five banner_plan tools forming an internally consistent verb-suffixed cluster. Minor deviations: unw_search is the lone bare verb, unw_plan_draft uses a noun+noun order unlike its sibling unw_roadmap, and unw_register_preview vs unw_registration_window use different stems for the same domain.
Twenty tools is slightly above the comfortable range, but the surface spans several genuinely separate concerns (auth, audit, catalog search, RMP, drafting, Banner worksheet CRUD, registration checks), and each tool maps to a real operation. The only marginal additions are the near-paired audit/remaining and search/candidates tools.
The lifecycle is well covered: state check, profile, audit and unmet requirements, term catalog and course detail, candidate resolution, ratings, conflict checking, single- and multi-term planning, Banner worksheet create/add/remove/delete, and registration eligibility previews. The notable gap is that nothing ever performs a real add/drop/register or waitlist action — a deliberate safety boundary, but it leaves an agent at a dead end for the final registration step, and there is no schedule export.