unw-mcp
This MCP server lets an AI assistant plan a University of Northwestern – St. Paul student's degree, schedules, and Banner registrations by reading live academic data and writing to Banner only with explicit confirmation.
Session & identity: check UNW login status (
unw_session) and read Degree Works profile details—majors, GPA, credits, advisors, holds (unw_profile).Degree audit: pull the full requirement tree (
unw_audit) or the authoritative list of unmet requirements (unw_remaining).Course search: list Banner terms (
unw_terms), search sections by subject/number/keyword/instructor/attribute/open seats (unw_search), and get full section detail—meetings, prerequisites, RMP evidence (unw_course).Requirement matching: resolve unmet requirements to offered sections, with reasons when nothing fits (
unw_candidates), and check offering patterns across past/future terms (unw_offering_matrix).Professor ratings: batch Rate My Professors lookups with weak-evidence flags (
unw_ratings).Scheduling: detect pairwise time conflicts with a week grid (
unw_conflicts), draft a conflict-free term plan with pins/exclusions/time filters (unw_plan_draft), and build a multi-term roadmap to graduation (unw_roadmap).Banner Plan Ahead worksheets: list term plans (
unw_banner_plans), and create, add courses to, remove from, or delete plans—all guarded by enforced confirmation (unw_banner_plan_create/add/remove/delete).Registration readiness: dry-run registration checks for eligibility, seats, conflicts, and prerequisites (
unw_register_preview) and read registration time-ticket windows (unw_registration_window). It never actually registers, adds, drops, or withdraws.
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., "@unw-mcp check my degree audit and what requirements I still need"
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.
<div align="center">
🎓 Eagle Flightplan
An AI-ready degree & schedule planner for University of Northwestern – St. Paul students.
Ask your AI assistant what classes you still need, find open sections that fit your life, avoid time conflicts, and map out every semester to graduation.
</div>
Independent Project: unw-planner is built for UNW students and is not affiliated with, endorsed by, or supported by the University of Northwestern – St. Paul, Ellucian, or Rate My Professors.
✨ What It Does
Instead of clicking through half a dozen student portals, connect unw-planner to your favorite AI tool (like Claude Desktop or Cursor) and plan your degree in plain English:
Checks what you have left — Reads your degree progress and remaining requirements automatically.
Finds real, open classes — Matches your remaining credits against the live UNW course catalog and open sections.
Prevents time conflicts — Builds conflict-free schedules for next semester or your entire path to graduation.
Factors in professor ratings — Uses Rate My Professors scores as a gentle tie-breaker when multiple sections fit.
Related MCP server: ewm-ops-mcp
🧠 How Your AI Uses It
flowchart LR
S["🎓 You (Student)<br/>Chat in plain English"] <--> AI["🤖 AI Assistant<br/>Claude, Cursor, etc."]
AI <--> MCP["⚡ unw-planner<br/>MCP Server"]
MCP --> A["📋 Degree Progress<br/>Remaining credits & requirements"]
MCP --> B["🔍 Live Course Search<br/>Open sections, seats & times"]
MCP --> C["🗓️ Schedule Builder<br/>Conflict checks & multi-term plans"]
MCP --> D["⭐ Professor Insights<br/>Rate My Professors preference"]
A & B & C & D --> Plan["✅ Tailored Semester Plan<br/>Tweak interactively anytime"]
Plan -.->|"Swap a class, avoid 8 AMs, balance credits"| AI🚀 Quick Start
1. Install in one command
Requires Python 3.11+ and a UNW student account.
pipx install git+https://github.com/HenryGetz/unw-planner.git2. Sign in with your UNW account
Run the login setup once to connect your UNW Microsoft account:
unwplanner loginLocal & private: Your session stays on your own computer—credentials and session cookies are stored locally and refreshed automatically so you aren't prompted every time.
Two-factor friendly: Supports your standard Microsoft phone approval (or an authenticator TOTP code if you prefer).
3. Connect to your AI tool
Add unw-planner to your AI client's MCP config (for example, Claude Desktop's claude_desktop_config.json):
{
"mcpServers": {
"unw-planner": {
"command": "unwplanner-mcp"
}
}
}Restart your AI app, and you're ready to plan.
💬 Try Asking Your AI
Goal | Example Prompt |
Audit check | "What classes do I still need to graduate, and which ones are offered this fall?" |
Schedule build | "Build me a conflict-free 16-credit Fall schedule with no classes before 9:30 AM." |
Professor match | "Are there multiple sections for my stats requirement? Pick the highest-rated professor." |
Multi-term map | "Lay out every semester from now until Spring 2028 so I don't miss any prerequisites." |
Quick swap | "Move my Tuesday afternoon class to Thursday morning and re-check for conflicts." |
<details> <summary>🛠️ Using the CLI or developing locally?</summary>
Everything unw-planner exposes to your AI is also available from the terminal via unwplanner --help. Check the project's docs/ folder for standalone CLI commands, logging details, and contributor setup.
</details>
Available Tools
20 toolsunw_auditB
Structured degree-audit requirement tree (groups -> blocks -> course
options, with applied/in-progress/transfer flags). group filters by a
case-insensitive substring of a group title/kind or block label.
Inputs: group.
unw_banner_plan_addA
Add a section (crn) or a course (subject+number) to a Banner plan (writes to Banner).
Confirmation is ENFORCED: confirm is required and must be true, otherwise
the tool names the exact section/course and current plan state and performs no
write. plan is an id or exact name; ambiguous names are rejected with
candidates. Successful writes return a before/after diff read back from Banner.
Inputs: plan (required), term (required), confirm (required), crn, +2 more.
unw_banner_plan_createA
Create a named Banner Plan Ahead worksheet for term (writes to Banner).
Confirmation is ENFORCED, not advisory: confirm is required and must be
true, otherwise the tool returns the intended effect and the current plan
count without writing. Verify the effect with the user first. The student may
hold at most five plans per term; names cannot be renamed later.
Inputs: name (required), term (required), confirm (required).
unw_banner_plan_deleteA
Delete an entire Banner plan (writes to Banner, irreversible).
Confirmation is ENFORCED twice: confirm must be true AND confirm_name
must equal the plan's exact name. Otherwise the tool reports the intended
deletion and current plan state and performs no write. Successful deletion
returns the removed plan, remaining plan count and a before/after diff read
back from Banner.
Inputs: plan (required), term (required), confirm (required), confirm_name (required).
unw_banner_plan_removeA
Remove one course row from a Banner plan (writes to Banner).
Confirmation is ENFORCED: confirm is required and must be true, otherwise
the tool names the exact row and projected credits and performs no write.
Identify the row by crn or subject+number; plan is an id or exact name.
Successful writes return a before/after diff read back from Banner.
Inputs: plan (required), term (required), confirm (required), crn, +2 more.
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
term; an empty list means "no plans for THIS term", not "no plans exist"
(check other terms, and remember the session term must be bound).
Inputs: term (required).
unw_candidatesA
Resolve unmet requirements to sections offered in term (wraps the
catalog resolver). requirement matches an id, title, parent group or
target; omit it for every unmet requirement. Every empty result carries the
reason (never offered / all closed / already completed). limit caps
candidates per requirement (0=all); compact omits repeated section
detail. One requirement can be large, so prefer compact/limit for broad
queries.
Inputs: term (required), limit, compact, refresh, +2 more.
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.
Inputs: crns (required), term (required), refresh.
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.
Inputs: crn (required), term (required), refresh.
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.
Inputs: courses, refresh.
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.
required_crns/required_courses pin sections the student insists on;
each pin reports placed/unavailable/conflict/prereq_blocked/excluded/budget and
a failed pin makes ok=false. exclude_crns/exclude_courses remove
candidates. min_credits keeps filling elective pools until the load is met
(and reports min_credits_met). hours maps a CRN to the credit hours to
reserve for a variable-credit section (default: the low end). Pins apply to
this single-term draft only, not to unw_roadmap. include_summer=True also
drafts the following summer for requirements that did not fit.
Inputs: term (required), hours, latest, profile, +12 more.
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.
Inputs: no named parameters.
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; refresh=True refetches now. Transient
RMP failures are never cached.
Inputs: names (required), refresh.
unw_register_previewA
DRY RUN ONLY: never posts add/drop/register. Returns Banner's real term
eligibility flags and failure text for term, then local checks for the
requested CRNs: seats/availability, time conflicts and prerequisites
(prereq_ok is null when unverified). If Banner reports the term as
ineligible, treat its failure text as the answer; never attempt real
registration.
Inputs: crns (required), term (required), refresh.
unw_registration_windowA
READ-ONLY registration time-ticket window(s). With term, returns that
term's window; without it, returns the configured current term and the next
selectable term. Each row carries Banner's verbatim eligibility failure text,
parse_status (parsed/no_ticket/not_eligible/unknown), America/Chicago
start/end, seconds until opening and a countdown. It NEVER registers, adds,
drops or withdraws; parse_status=unknown must be reported from raw_text.
Inputs: term.
unw_remainingA
Unmet requirements only: id, title, parent group, kind, credits remaining,
pick-N progress, course/attribute/wildcard options, status, priority class and
shared_title_with (other ids with the same title/options: double-counting
risk). This is the authoritative "what is left" list.
Inputs: no named parameters.
unw_roadmapA
Multi-term plan starting at start_term (default: the start term plus
three non-summer terms; summer only when include_summer). Carries requirements
and prerequisites forward, reports terms with no published catalog, and returns
graduation-risk notes against the audit's anticipated graduation term. Course
pins, minimum-load and instructor exclusions are draft-only: use
unw_plan_draft for those.
Inputs: start_term (required), terms, refresh, max_credits, +1 more.
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. limit is capped at 200; when
limit_capped is true follow next_offset to page through the rest.
Inputs: term (required), limit, number, offset, +6 more.
unw_sessionA
Check the UNW session: authenticated (live check), degraded (state
exists but the live check failed), state-file age, cookie count and earliest
cookie expiry (values are never exposed), plus read_hint/write_hint
and the exact packaged CLI command that repairs an expired session. Call this
before any other tool. If unauthenticated but degraded, try one read tool
before asking for a login.
Inputs: no named parameters.
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.
Inputs: refresh.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
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.
Maintenance
Related MCP Connectors
Read-only checks for proposed orders against evidence and policy; no trading or payment authority.
Inspect outreach delivery, campaigns, leads and pipeline; prepare sequence drafts. Read-only.
Read-only CRE prospects, listings, campaigns, reporting, broker search, and resources.
Read-only agent-commerce audit, upgrade verification, diagnosis and x402 probing.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables read-only inspection of Google Ads accounts through MCP, including account inventory, reporting, metadata, change history, and safe GAQL queries.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables warehouse operations agents to inspect tasks, deliveries, stock, and KPIs, and to attempt write operations in shadow mode with human approval and segregation of duties enforced as code.MIT
- FlicenseAqualityCmaintenanceEnables read-only interaction with CMU Student Information Online data, including student context, schedules, grades, enrollment, account activity, and campus life through MCP tools.8-
- FlicenseNot gradedqualityCmaintenanceEnables a study assistant to explain topics, build study plans, and generate revision checklists, with read-only access to course outline and status resources.-