purdue-mcp
One MCP server that exposes 33 tools over 13 public Purdue data sources — no auth, no API key — covering dining, course registration, academics, campus life, facilities, athletics, transit, exams, news, weather, and more.
Dining: live menus, find dishes across courts, nutrition info, line lengths, location status.
Registration: real-time seat/waitlist counts per section (Banner), prerequisites/restrictions per CRN, open terms.
Academics: course catalog search, sections/meeting times, term/subject lists, building lookup.
Campus life: official events, student orgs & their profiles, club events, Huddle flyers, r/Purdue, Purdue Exponent.
Facilities: live gym/CoRec occupancy (headcount, % capacity), library hours (today or week).
Athletics: varsity sports, full schedules, upcoming games across all sports.
Getting around: CityBus routes/stops, next scheduled departures (timetable only).
Exams: scheduled evening/final exams for courses, upcoming exam windows, schedule status.
News & deadlines: Purdue newsroom articles, academic calendar/registrar pages.
Environment: current campus weather, forecast, NWS alerts.
All tools are read-only, use public endpoints, and default to the campus timezone.
Fetches current posts from r/Purdue — housing and sublease chatter, campus gripes, events, and advice threads — via Reddit's public feed, giving an unofficial pulse of student life.
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., "@purdue-mcp when's the next bus from the PMU?"
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.
purdue-mcp
One MCP server for all public, real-time Purdue University data — dining menus, live gym occupancy, the course catalog, bus times, campus events, student orgs, library hours, athletics, news, and weather. Point any MCP client (Claude Code, Claude Desktop, Cursor, …) at it and ask "what's for dinner at Wiley", "how busy is the CoRec", or "when's the next bus from the PMU".
33 tools across 13 public sources.
Everything it reads is public and unauthenticated. It never touches a student account, grades, schedules, bursar records, or anything behind a Purdue login.
Unofficial and community-run. Not affiliated with, endorsed by, or operated by Purdue University.
Install
Terminal / application CLI
npx -y -p purdue-mcp@latest purdue-data list
npx -y -p purdue-mcp@latest purdue-data schema dining_menu
npx -y -p purdue-mcp@latest purdue-data call dining_menu '{"location":"Wiley","meal":"Lunch"}'list and schema print JSON. call prints the MCP tool result as JSON and exits
nonzero on tool errors. No shell command is passed through to a Purdue tool.
The CLI ships alongside the existing MCP transports; publish this package version
before using the @latest commands above.
Claude Code
claude mcp add purdue -s user -- npx -y purdue-mcp@latestCodex CLI
codex mcp add purdue -- npx -y purdue-mcp@latestCursor / Claude Desktop / Windsurf — merge into the client's MCP config:
{
"mcpServers": {
"purdue": {
"command": "npx",
"args": ["-y", "purdue-mcp@latest"]
}
}
}The @latest tag re-resolves the newest version on every launch, so it stays
current on its own. Needs Node 20+. No API key, no account, no auth.
Config paths, VS Code, offline/global install, and troubleshooting are in install.md.
Let an agent install it
Paste this into any coding agent:
Install the
purdue-mcpMCP server for me — public real-time Purdue University data (dining menus, live gym occupancy, courses, bus times, events, athletics, library hours, weather). On npm aspurdue-mcp, needs Node 20+, no API key. Detect my MCP client and register it withnpx -y purdue-mcp@latestas the command, using the@latesttag so it stays current. Then verify it connects and tell me which tools it exposes. Full instructions: https://raw.githubusercontent.com/sharziki/purdue-mcp/main/install.md
Or run from source
git clone https://github.com/sharziki/purdue-mcp && cd purdue-mcp
npm install && npm run buildRelated MCP server: SG Gov MCP Server
Tools
Dining — Purdue HFS dining API
Tool | What it answers |
| Every dining court / Quick Bites / On-the-GO!, open right now or next meal time |
| Full menu for a location and date, by meal and station, with vegan/vegetarian/allergen filters |
| "Who's serving chicken tenders today?" — searches every dining court at once |
| Full nutrition panel for any menu item |
| Crowdsourced live line-length reports (populated around peak meal hours) |
Registration — live seats (Purdue Banner)
Tool | What it answers |
| How many seats are actually open right now in each section, with waitlists, CRNs, meeting times, instructors |
| Seats, waitlist, prerequisites, and major/level restrictions for one CRN — "why can't I register for this" |
| Which terms are open for registration vs. view-only |
Academics — Purdue.io course catalog
Tool | What it answers |
| Term codes and date ranges, newest first |
| Every subject code (CS, MA, ENGR, …) |
| Courses by subject, number, or title keyword — with descriptions and credit hours |
| CRNs, section types, meeting days/times, rooms, and instructors for a term |
| Resolve a building code, e.g. |
Campus life
Tool | What it answers |
| Official university calendar — lectures, athletics, career fairs, deadlines |
| ~1,200 student orgs, searched by what someone is into — typo-tolerant, understands campus synonyms, reads full descriptions. |
| One org in full: mission, contact email and phone, website and every social account, categories, whether it's taking members, next events |
| Upcoming club events: callouts, socials, meetings — same search, plus filters for host org, theme, category, free food/free stuff, and date window |
| One club event in full: complete description, street address and coordinates, perks, RSVP count and spots left |
| The exact org/event category and theme names the two searches accept |
| Student-posted flyers from Huddle — callouts, free-food nights, tryouts and socials that never reach the official calendar. Same typo-tolerant search, plus tag/org filters and a ~2,600-event archive |
| What students are actually talking about on r/Purdue (unofficial) |
| Purdue Exponent student newspaper — campus reporting, editorially independent |
Facilities
Tool | What it answers |
| Live headcount and % capacity for all 37 counted RecWell spaces — "how busy is the CoRec right now" |
| Today's hours and open/closed status for every library, or the full week |
Athletics
Tool | What it answers |
| Every varsity team and its current season schedule |
| Full season for one team — opponents, rankings, home/away, venue, results |
| Next Boilermaker games across all sports, soonest first |
Getting around
Tool | What it answers |
| Every CityBus route serving campus and Greater Lafayette |
| Find stops by name, or the stops nearest a lat/lon |
| Next scheduled departures from a stop, with minutes-until |
Exams
Tool | What it answers |
| Every scheduled exam for a course — date, time, rooms, days remaining |
| What is coming in the next N days, optionally only your courses |
| Which term the published schedules cover, and how many exams they hold |
Purdue schedules evening exams at night, outside normal class meetings, and they are what mid-semester study planning turns on; a course requiring them is flagged in the catalog. Final exams are the separate end-of-term block. Both come from the Registrar's published schedules.
upcoming_exams(days: 21, courses: ["MA 26100", "CS 18000"])
→ CS 18000GLD — Wed 2026-09-30 08:00p-09:00p (in 12d) · HAAS G050, … [evening]
MA 26100 — Mon 2026-10-05 08:00p-09:00p (in 17d) · Loeb Plyhs, … [evening]News and deadlines
Tool | What it answers |
| Official newsroom articles, searchable |
| First day of classes, breaks, finals week, add/drop deadlines |
Environment
Tool | What it answers |
| Current conditions, forecast, and active NWS alerts for West Lafayette |
Dates default to today in the campus timezone (America/Indiana/Indianapolis), so the server gives the right answer no matter where it runs.
Data sources
Source | Endpoint | Notes |
Purdue Dining (HFS) |
| Official, public, unauthenticated |
Purdue Banner |
| Public class search — no login. Authoritative for seats/waitlist/prereqs. HTML, so parsing is version-sensitive. |
Purdue.io |
| Community-run open-source catalog mirror (Purdue-io/PurdueApi) |
Purdue Events |
| Localist public API |
Huddle |
| Student-run event app; one request returns the whole college corpus. Behind Vercel's bot challenge, so it is pulled by |
BoilerLink |
| Anthology Engage public discovery API. Same host students use; |
Purdue RecWell |
| Live occupancy counters; account key is the one Purdue's own public widget ships |
Purdue Libraries |
| Springshare LibCal public hours endpoints |
Purdue Athletics |
| Official athletics site's public JSON API |
Purdue Newsroom / Registrar |
| WordPress REST API |
Registrar exam schedules |
| The only published form; there is no exam API. UniTime-generated PDFs at stable |
CityBus |
| Static schedule feed; no public real-time feed exists |
r/Purdue |
| Unofficial student chatter |
Purdue Exponent |
| Independent student newspaper |
NOAA / NWS |
| Public federal API |
Huddle needs one command from you
Huddle is the only source here that cannot be fetched at request time. Every
plain HTTP client — curl, fetch, this server — gets 429 with
x-vercel-mitigated: challenge, whatever the headers. And the challenge is
IP-reputation gated: a real browser clears it in about a second from a home or
campus connection, and never clears it from a datacenter address (measured
on a VPS, which by extension rules out CI runners and any hosted mirror).
There is therefore no server anyone can run that stays fresh. So the fetch happens on your machine, when you ask for it:
npx -y purdue-mcp-huddle # ~4s, uses a Chrome you already haveThat writes ~/.cache/purdue-mcp/huddle-purdue.json (~2,600 events) and
huddle_events prefers it from then on. Nothing is installed as a service,
nothing runs in the background, and no browser profile or login is touched — a
throwaway profile opens the public events page, reads the API from inside it,
and exits. puppeteer-core drives a browser you already have; no browser is
downloaded.
To keep it current, put it on cron — or don't, and refresh when you care. Every
response states how old its copy is and warns past six hours. Full setup,
scheduling and troubleshooting: skills/purdue-huddle,
which an agent can follow on your behalf.
Where it reads from | When |
| Set — a file path or a URL. Lets a club share one copy. |
| You ran the refresher. |
A copy on this repo's | You haven't. Refreshed by hand, often stale, and labelled "shared copy" in every response. |
Requires a Chromium-family browser (Chrome, Chromium, Edge, Brave). Firefox cannot be used — it does not speak the DevTools protocol.
Responses are cached in-process with short TTLs (30s–24h depending on how fast the data moves) to stay a polite client. Nothing is persisted to disk.
Ruled out (investigated, no public source)
Laundry machine availability — Purdue moved residence-hall laundry to CSCPay Mobile, which has no public web status page. The old
washalertwebhost the community app scraped no longer resolves.Real-time bus positions — CityBus publishes GTFS static only. No GTFS-Realtime feed is listed on Transitland or the Mobility Database, and MyRide's backend is not public.
bus_next_departuresreturns timetable times.Parking garage availability — Purdue Parking publishes no live space counts.
Grades, personal schedules, bursar — behind the myPurdue login. Out of scope by design.
Library study-room availability — LibCal's spaces API requires OAuth credentials the library would have to issue.
Laundry (again) — CSCPay has no public read API of any kind.
Seat availability was on this list — it turned out Banner's class search needs no login, so course_availability now covers it.
Adding a source
Each source is one file in src/sources/ exporting a registerX(server) that calls server.registerTool(...). Register it in src/index.ts. Use getJSON() from src/lib/http.ts so you inherit the timeout, User-Agent, and cache.
Rules of the road:
Public data only. Nothing that needs a Purdue login, and nothing about a specific individual.
Verify the endpoint is live before shipping it —
npm run smokehits every real upstream and is the test suite.Be a polite client. Sensible cache TTL, no tight polling.
npm run build
npm run smoke # live end-to-end check of all toolsLicense
MIT
Available Tools
29 toolsacademic_calendarPurdue academic calendar and registrar infoA
The official academic calendar — first day of classes, breaks, finals week, commencement — plus any registrar page (add/drop deadlines, exam scheduling, grade policies) by keyword. Source: purdue.edu/registrar (WordPress REST API, live).
Inputs: limit, query.
athletics_schedulePurdue team scheduleA
Full season schedule for one Purdue team — dates, opponents, home/away, venue, and final scores where played. Source: purduesports.com (official athletics site API).
Inputs: sport (required), upcoming_only.
athletics_sportsList Purdue varsity sportsB
Every Purdue varsity sport and its current schedule id. Source: purduesports.com (official athletics site API).
Inputs: no named parameters.
athletics_upcomingNext Purdue games across all sportsA
The next Boilermaker games across every varsity sport, soonest first — what to go watch this week. Source: purduesports.com (official athletics site API).
Inputs: days, limit, home_only.
banner_termsList Banner registration termsA
Terms available in Purdue's live registration system, newest first. Terms marked 'View only' are closed to registration. Source: Purdue Banner self-service.
Inputs: no named parameters.
bus_next_departuresNext scheduled buses from a stopA
Next scheduled CityBus departures from a stop today, by route and headsign. These are timetable times — CityBus publishes no public real-time feed, so buses may run early or late. Source: CityBus GTFS feed.
Inputs: stop (required), date, limit.
bus_routesList CityBus routesA
Every CityBus route serving Purdue and Greater Lafayette. Source: CityBus GTFS feed (scheduled service; CityBus publishes no public real-time feed).
Inputs: query.
bus_stopsFind CityBus stopsA
Search CityBus stops by name, or find the stops nearest a latitude/longitude on campus. Source: CityBus GTFS feed.
Inputs: lat, lon, limit, query.
campus_weatherPurdue campus weatherA
Current conditions and forecast for the Purdue West Lafayette campus, plus any active severe-weather alerts. Source: NOAA/NWS api.weather.gov (live).
Inputs: hourly, periods.
course_availabilityLive seat and waitlist counts for a courseA
How many seats are actually open in each section of a course right now, with waitlist counts, CRNs, meeting times, and instructors. This is the authoritative registration data — use it over search_courses/course_sections when the question is 'can I get in'. Source: Purdue Banner self-service (public, live).
Inputs: number (required), subject (required), term, limit, +1 more.
course_sectionsGet sections and meeting times for a courseB
CRNs, section types, meeting days/times, rooms, and instructors for a course in a given term. Source: Purdue.io.
Inputs: number (required), subject (required), term.
dining_find_itemFind a food item across dining courtsA
Search every Purdue dining court's menu for a dish on a given date — answers 'who is serving chicken tenders today'. Source: Purdue HFS dining API (live).
Inputs: query (required), date, meal, include_retail.
dining_item_nutritionNutrition facts for a dining itemA
Full nutrition panel for one menu item, by the item id returned from dining_menu or dining_find_item. Source: Purdue HFS dining API (live).
Inputs: item_id (required).
dining_line_lengthLive dining court line lengthsA
Crowdsourced real-time line-length reports for Purdue dining courts. Often empty outside peak hours. Source: Purdue HFS dining API (live).
Inputs: no named parameters.
dining_locationsList Purdue dining locationsA
List every Purdue dining location (dining courts, quick bites, On-the-GO!) with whether it is open right now and the next meal period. Source: Purdue HFS dining API (live).
Inputs: type, open_now.
find_buildingLook up a campus buildingA
Resolve a Purdue building short code or name (e.g. 'LWSN' -> Lawson Computer Science Building). Source: Purdue.io.
Inputs: query.
library_hoursPurdue library hoursA
Today's hours and open/closed status for every Purdue library and study space (WALC, Hicks, HSSE, Parrish, Archives, …), or a full week's grid. Source: Purdue Libraries LibCal (live).
Inputs: week, query, open_now.
list_subjectsList course subjectsA
All course subject codes at Purdue (CS, MA, ENGR, …), optionally filtered by name. Source: Purdue.io.
Inputs: query.
list_termsList Purdue academic termsA
Every term in the Purdue course catalog, newest first, with codes and date ranges. Use the code with the other course tools. Source: Purdue.io (community catalog mirror).
Inputs: limit.
purdue_exponentPurdue Exponent student newspaperB
Articles from the Purdue Exponent, the independent student newspaper — campus reporting, student government, local news, sports coverage. Editorially independent of the university. Source: purdueexponent.org public feed.
Inputs: limit, section.
purdue_newsPurdue University newsA
Official Purdue newsroom articles — research announcements, university decisions, campus news — searchable by keyword. Source: purdue.edu/newsroom (WordPress REST API, live).
Inputs: limit, query, full_text.
recwell_occupancyLive gym / CoRec occupancyA
Real-time headcount and percent-of-capacity for every counted Purdue RecWell space — CoRec fitness floors, tracks, courts, climbing walls, pools. Answers 'how busy is the gym right now'. Source: Purdue RecWell live facility counts (updates ~every 30s).
Inputs: sort, query, open_only.
reddit_purdueWhat Purdue students are talking aboutA
Current posts from r/Purdue — the unofficial student pulse: housing and sublease chatter, campus gripes, events, advice threads, what is actually happening this week. Unofficial and unmoderated by the university; treat as opinion, not fact. Source: reddit.com/r/Purdue public feed.
Inputs: sort, limit.
search_club_eventsSearch student-org events on BoilerLinkA
Upcoming student organization events (club meetings, socials, callouts) with time, room, and host org. Distinct from the official university calendar. Source: BoilerLink / Anthology Engage (live).
Inputs: limit, query.
search_coursesSearch the Purdue course catalogB
Find courses by subject code, course number, and/or title keyword — returns titles, credit hours, and descriptions. Source: Purdue.io.
Inputs: limit, number, subject, title_contains.
search_eventsSearch official Purdue campus eventsB
Official university event calendar (lectures, athletics, concerts, deadlines, career fairs) with times, locations, and links. Source: events.purdue.edu (Localist, live).
Inputs: days, limit, query, start.
search_student_orgsSearch Purdue student organizationsB
Search BoilerLink's directory of ~1,200 registered student organizations by name or keyword. Source: BoilerLink / Anthology Engage (live).
Inputs: limit, query.
section_detailsFull registration detail for one CRNA
Everything Banner knows about one section: seats, waitlist, prerequisites, and major/level restrictions. Answers 'why can't I register for this'. Meeting times come from course_availability or course_sections. Source: Purdue Banner self-service (public, live).
Inputs: crn (required), term.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 29 tools
Each tool targets a distinct resource and action, such as bus stops versus departures, dining locations versus menus, and course search versus availability. The descriptions clearly differentiate overlapping domains like official events and club events.
All 29 tools follow a consistent snake_case pattern with a domain-specific prefix (bus_, dining_, list_, search_, etc.) and a descriptive verb or noun. The naming is predictable and easy to interpret.
With 29 tools, the set is on the high side, exceeding the typical 3-15 range for a well-scoped server. However, the server covers a broad range of university functions (dining, transportation, courses, events, athletics, etc.), and each tool serves a specific purpose, making the count borderline reasonable.
The server covers most common Purdue queries: dining, bus, courses, registration, events, athletics, news, calendar, library, weather, recwell, and student organizations. Minor gaps like parking or a campus map exist, but the surface is extensive and cohesive.
Maintenance
Related MCP Connectors
This MCP server provides seamless access to Malaysia's government open data, including datasets, w…
Public MCP server for discovering open jobs. Search, filter, and get application links.
One MCP server for 180+ live web-data APIs returning clean JSON from sites that block scrapers.
The official Planning Center MCP server for interacting with your ministry's data.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAn MCP server that connects AI assistants to university D2L Brightspace and Piazza, enabling query of courses, grades, assignments, deadlines, files, and Piazza posts.7MIT
- AlicenseAqualityDmaintenanceUnified MCP server offering 30 tools for Singapore government and public data including weather, transport, education, and property, with many tools working immediately without API keys.34MIT
- FlicenseNot gradedqualityCmaintenanceMCP server that aggregates department notices and provides structured answers to queries about courses, schedules, and academic dates via tool calling.-
- FlicenseAqualityDmaintenanceMCP server for St. Louis transit developer tooling, providing 45 tools for GTFS and GTFS-Realtime inspection, feed surveillance, schedule and arrival queries, assertions, drift detection, and golden-fixture generation for the Light Phone 3 Kotlin transit app, all backed by public unauthenticated sources.45-