Skip to main content
Glama

<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>

NOTE

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.git

2. Sign in with your UNW account

Run the login setup once to connect your UNW Microsoft account:

unwplanner login
  • Local & 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."


&lt;details&gt; &lt;summary&gt;🛠️ Using the CLI or developing locally?&lt;/summary&gt;

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.

&lt;/details&gt;

Available Tools

20 tools
unw_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_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

    A3.6/5.0

    Scored across 20 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count4/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables read-only inspection of Google Ads accounts through MCP, including account inventory, reporting, metadata, change history, and safe GAQL queries.
      Apache 2.0
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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
    • F
      license
      A
      quality
      C
      maintenance
      Enables read-only interaction with CMU Student Information Online data, including student context, schedules, grades, enrollment, account activity, and campus life through MCP tools.
      8
      -