# io.github.avivkeller/umd-mcp (npm · umd-mcp)

MCP server exposing University of Maryland data

- Trust score: 81/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-23

## Components

- npm · `umd-mcp`: 81/100 (this document), [markdown](https://verifymcp.io/servers/avivkeller-umd-mcp/umd-mcp.md), [page](https://verifymcp.io/servers/avivkeller-umd-mcp/umd-mcp)

## Channel facts

- Registry: `npm`
- Package: `umd-mcp`
- Version: `0.0.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-23.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 65 of 218 dependencies flagged as unhealthy (3 deprecated).
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 22 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 82/100
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 9284 tokens (~92/item across 100 items; 100 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 73/100
  - Stability observed for 22 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (99% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 100 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 100 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the io.github.avivkeller/umd-mcp server?

io.github.avivkeller/umd-mcp runs locally as an npm package, launched with npx -y umd-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add avivkeller-umd-mcp -- npx -y umd-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "avivkeller-umd-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "umd-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "avivkeller-umd-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "umd-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add avivkeller-umd-mcp -- npx -y umd-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "avivkeller-umd-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "umd-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add avivkeller-umd-mcp --command npx --arg -y --arg umd-mcp
```

### Hermes

```yaml
mcp_servers:
  avivkeller-umd-mcp:
    command: "npx"
    args: ["-y", "umd-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "avivkeller-umd-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "umd-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add avivkeller-umd-mcp -t stdio -c npx -a -y umd-mcp
```

### Other

```json
{
  "mcpServers": {
    "avivkeller-umd-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "umd-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-21 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-19 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-17 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-15 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-13 (score 77, +6)

- [functional improvement] Stability: unverified → 0.40

### 2026-10-01 (score 71)

First indexed and scored.

## MCP tools (100)

### `login` (~111 tokens)

Sign in to UMD

Sign in with a UMD Directory ID. Opens a dedicated browser window (Chrome or Edge) at the UMD login page and waits up to 5 minutes for the user to finish, including Duo; the window closes by itself afterwards. The same sign-in also establishes sessions with every service other tools need (e.g. Testudo). Some services force re-authentication, so expect a prompt even if the user signed in recently. Call this when another tool reports that sign-in is required or a session has expired.

Output parameters:

- `attributes` (object): Attributes the IdP released about the user, e.g. mail, displayName, eduPersonAffiliation
- `services` (array): Single sign-on services other tools depend on, and whether each is signed in
- `user` (string): UMD Directory ID of the signed-in user, e.g. "jsmith"

### `logout` (~30 tokens)

Sign out of UMD

Forget the signed-in user and every service session, and clear the sign-in browser so the next login prompts again.

### `whoami` (~32 tokens)

Who am I

Report the currently signed-in UMD user, or that nobody is signed in, and which services have a live session.

Output parameters:

- `attributes`: null when nobody is signed in
- `services` (array): Single sign-on services other tools depend on, and whether each is signed in
- `signed_in` (boolean): Whether a user is signed in
- `user`: null when nobody is signed in

### `planetterp_get_course` (~74 tokens)

Get a course

Look up a UMD course by its code on PlanetTerp. Returns catalog information, the average GPA, professors who have taught it, and student reviews written for it. No login needed.

Input parameters:

- `course` (string, required): Course id, e.g. "CMSC131" or "ENGL101X"

Output parameters:

- `average_gpa` (number|null): Average GPA across all recorded sections, on a 4.0 scale; null if no grade data
- `course_number` (string): Course number within the department, e.g. "131"
- `credits`: Number of credits the course is worth; null if unknown
- `department` (string): Four-letter department code, e.g. "CMSC"
- `description` (string|null): Catalog description of the course, which may contain HTML tags; null if none
- `name` (string): Full course code, e.g. "CMSC131"
- `professors` (array): Names of professors who have taught this course; a name repeats once per section taught
- `reviews` (array): Student reviews of professors, written for this course
- `title` (string|null): Course title, e.g. "Object-Oriented Programming I"; null if unknown

### `planetterp_list_courses` (~101 tokens)

List courses

List UMD courses on PlanetTerp in alphabetical order, optionally within one department. No login needed.

Input parameters:

- `department` (string): Only list courses in this four-letter department, e.g. "CMSC" (default: all departments)
- `limit` (integer): Maximum number of records to return, 1-100 (default 100)
- `offset` (integer): Number of records to skip, for pagination (default 0)

Output parameters:

- `courses` (array): Courses matching the query

### `planetterp_get_professor` (~65 tokens)

Get a professor

Look up a UMD professor or teaching assistant by name on PlanetTerp. Returns the courses they have taught, their average rating, and student reviews. No login needed.

Input parameters:

- `name` (string, required): Name of the professor, e.g. "Jon Snow"

Output parameters:

- `average_rating` (number|null): Average student rating, on a 1-5 scale; null if the professor has no reviews
- `courses` (array): Courses this professor has taught; a code repeats once per section taught
- `name` (string): Name of the professor
- `reviews` (array): Student reviews of this professor
- `slug` (string): PlanetTerp's unique identifier for the professor; their page is https://planetterp.com/professor/<slug>
- `type` (string): "ta" if this person is a teaching assistant, "professor" otherwise

### `planetterp_list_professors` (~96 tokens)

List professors

List UMD professors and teaching assistants on PlanetTerp in alphabetical order. No login needed.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-100 (default 100)
- `offset` (integer): Number of records to skip, for pagination (default 0)
- `type` (string): Only list professors ("professor") or teaching assistants ("ta"); default: both

Output parameters:

- `professors` (array): Professors matching the query

### `planetterp_get_grades` (~175 tokens)

Get grades

Grade distributions from PlanetTerp for a course, a professor, or both, broken down by section. At least one of course or professor is required; semester and section narrow the result. No login needed.

Input parameters:

- `course` (string): Only include grades for this course, e.g. "MATH140"
- `professor` (string): Only include grades for sections taught by this professor, e.g. "Jon Snow"
- `section` (string): Only include this section, e.g. "101" or "0101" (default: all sections)
- `semester` (string): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `grades` (array): One entry per section matching the query

### `planetterp_search` (~127 tokens)

Search

Search PlanetTerp for courses and professors whose code or name contains the query, as the site search bar does. Use this to find the exact course code or professor name before calling planetterp_get_course or planetterp_get_professor. No login needed.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-100 (default 30)
- `offset` (integer): Number of records to skip, for pagination (default 0)
- `query` (string, required): Text to search for, e.g. "CMSC13" or "Snow"

Output parameters:

- `results` (array): Courses and professors matching the query

### `nutrition_get_menu` (~92 tokens)

Get a dining hall menu

What a UMD dining hall is serving on a given day, by meal period and station, with allergens and dietary labels for each dish, from nutrition.umd.edu. No login needed.

Input parameters:

- `date` (string): Day to get the menu for, as YYYY-MM-DD (default: today). Menus are posted about a week ahead.
- `hall` (string, required): Dining hall to get the menu for

Output parameters:

- `meals` (array): Meal periods served that day, in order; empty if no menu is posted for that date

### `nutrition_get_recipe` (~72 tokens)

Get a recipe's nutrition label

The nutrition label for a dish on a UMD dining hall menu: serving size, calories, nutrition facts with daily values, ingredients and allergens. Use the id from nutrition_get_menu. No login needed.

Input parameters:

- `id` (string, required): Recipe identifier from a menu item, e.g. "060064*2"

Output parameters:

- `allergens` (array): Allergens the label declares, e.g. "gluten", "soybeans", "sesame"; empty if none
- `calories` (integer): Calories per serving
- `id` (string): Recipe identifier, e.g. "060064*2"
- `ingredients` (array): Ingredients in order of predominance, each keeping its sub-ingredients in parentheses, e.g. "Tofu (Water, Soybeans, Calcium Sulfate)"
- `name` (string): Name of the dish, e.g. "Bacon"
- `nutrients` (array): Nutrition facts per serving, in the order the label lists them
- `serving_size` (string): Serving size as printed, e.g. "2 ea" or "4 oz"

### `testudo_soc_list_terms` (~48 tokens)

List Schedule of Classes terms

Terms the UMD Schedule of Classes currently lists (about four: the current term plus the next few). Returns the term ids the other Schedule of Classes tools take. No login needed.

Output parameters:

- `terms` (array): Terms in the order the site lists them

### `testudo_soc_list_departments` (~87 tokens)

List departments

Departments (four-letter course prefixes) offering courses in a term, from the UMD Schedule of Classes. No login needed.

Input parameters:

- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `departments` (array): Departments in alphabetical order; empty for a term the site does not list

### `testudo_soc_list_courses` (~135 tokens)

List courses in a department

Every course a department offers in a term, from the UMD Schedule of Classes: title, credits, grading methods, gen-ed codes, prerequisites and description. Sections are not included; call testudo_soc_get_sections or testudo_soc_get_course for those. No login needed.

Input parameters:

- `department` (string, required): Four-letter department code, e.g. "CMSC"
- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `courses` (array): Courses in catalog order; empty when the department offers none that term
- `department` (object): The department
- `seats_as_of` (string|null): When the seat counts on this page were last refreshed, as YYYY-MM-DDTHH:MM in US Eastern time (roughly hourly); null if the page does not say

### `testudo_soc_get_course` (~122 tokens)

Get a course with its sections

One course in a term from the UMD Schedule of Classes, with every section: instructors, seat counts, meeting days, times, rooms and delivery method. No login needed.

Input parameters:

- `course_id` (string, required): Course id, e.g. "CMSC131" or "ENGL101X"
- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `course` (object): The course and its sections
- `seats_as_of` (string|null): When the seat counts on this page were last refreshed, as YYYY-MM-DDTHH:MM in US Eastern time (roughly hourly); null if the page does not say

### `testudo_soc_get_sections` (~283 tokens)

Get sections

Sections of one or more courses in a term, from the UMD Schedule of Classes: instructors, seat counts, meeting days, times, rooms and delivery method. Seat counts are a snapshot refreshed roughly hourly, not real time. No login needed.

Input parameters:

- `course_ids` (array, required): Course ids to get sections for, up to 10 per call, e.g. ["CMSC131", "CMSC132"]
- `teaching_center` (string): Only sections taught at this location or in this program: "ALL" all locations and programs, "*" College Park campus, "DC" District of Columbia, "FS" Frostburg State, "HG" Hagerstown, "HT" Heat Center…
- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `sections` (object): Sections keyed by course id, in the order the site lists them; a course the site does not offer that term is absent

### `testudo_soc_search_courses` (~594 tokens)

Search courses

Search the UMD Schedule of Classes for a term the way its search form does. Needs at least one of course_id (a department prefix, partial id or full id), instructor, or delivery; the other fields narrow the results. When the search narrows by section (instructor, days, time, delivery, open seats, credits or level) the matching sections come back inline; otherwise sections are null and testudo_soc_get_sections fetches them. No login needed.

Input parameters:

- `course_id` (string): Department prefix ("CMSC"), partial id ("CMSC13") or full course id ("CMSC131") to match
- `credits` (integer): Only courses whose credits satisfy credits_compare against this value, 0-4
- `credits_compare` (string): How to compare course credits with `credits` (default "=")
- `days` (array): Only sections that meet on these weekdays
- `delivery` (array): Only sections taught in these ways (default: any)
- `end_time` (string): End of the range when time_compare is "between", e.g. "3:00 PM"
- `instructor` (string): Instructor name as testudo_soc_autocomplete_instructors returns it in `name`, e.g. "Gonzalez, Elias"
- `level` (string): Only undergraduate ("UGRAD") or graduate ("GRAD") courses (default "ALL")
- `open_sections_only` (boolean): Only sections with open seats (default false)
- `section_id` (string): Only this section, e.g. "0101"; use together with a full course_id
- `start_time` (string): Time for time_compare, on the quarter hour, e.g. "12:00 PM" or "9:30 AM"
- `teaching_center` (string): Only sections taught at this location or in this program: "ALL" all locations and programs, "*" College Park campus, "DC" District of Columbia, "FS" Frostburg State, "HG" Hagerstown, "HT" Heat Center…
- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026
- `time_compare` (string): Only sections whose meetings start "after", "at" or "before" start_time, or "between" start_time and end_time

Output parameters:

- `courses` (array): Matching courses grouped by department, in catalog order
- `message` (string|null): Message the site shows instead of results, e.g. that no courses matched or that the search needs more criteria; null when there are results
- `seats_as_of` (string|null): When the seat counts on this page were last refreshed, as YYYY-MM-DDTHH:MM in US Eastern time (roughly hourly); null if the page does not say

### `testudo_soc_autocomplete_courses` (~138 tokens)

Autocomplete course ids

Course ids and titles in a term whose id starts with the given text, from the UMD Schedule of Classes autocomplete. The cheapest way to find what a department offers or to resolve a partial course id. No login needed.

Input parameters:

- `query` (string, required): Start of a course id, e.g. "CMSC" (all CMSC courses) or "CMSC13"
- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `courses` (array): Courses offered that term whose id starts with the query

### `testudo_soc_autocomplete_instructors` (~134 tokens)

Autocomplete instructors

Instructors teaching in a term whose last or first name contains the given text, from the UMD Schedule of Classes autocomplete. Pass the returned `name` as the instructor to testudo_soc_search_courses. No login needed.

Input parameters:

- `query` (string, required): Part of a last or first name, at least two characters, e.g. "gonz"
- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `instructors` (array): Matching instructors

### `testudo_soc_list_gen_ed_categories` (~66 tokens)

List gen-ed categories

The general education categories and requirement codes (FSAW, DSHS, DVUP, ...) the UMD Schedule of Classes lists for a term. No login needed.

Input parameters:

- `term_id` (string): Term to list for (default: the newest term)

Output parameters:

- `categories` (array): Categories in the order the site lists them

### `testudo_soc_list_gen_ed_courses` (~124 tokens)

List gen-ed courses

Courses fulfilling one general education requirement in a term, from the UMD Schedule of Classes. Sections are not included; call testudo_soc_get_sections for those. No login needed.

Input parameters:

- `code` (string, required): General education code from testudo_soc_list_gen_ed_categories, e.g. "DSNL"
- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `courses` (array): Courses grouped by department, in catalog order; empty for an unknown code
- `seats_as_of` (string|null): When the seat counts on this page were last refreshed, as YYYY-MM-DDTHH:MM in US Eastern time (roughly hourly); null if the page does not say

### `testudo_soc_list_syllabi` (~129 tokens)

List syllabi

Past syllabi on file for a course in the UMD Schedule of Classes syllabus repository: the term and instructor of each. The PDFs themselves need a UMD login. No login needed for the list.

Input parameters:

- `course_id` (string, required): Course id, e.g. "CMSC131" or "ENGL101X"
- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `syllabi` (array): Syllabi on file, newest first as the site lists them

### `testudo_soc_get_building` (~100 tokens)

Get a building

Look up a classroom building by the building code and room number a section lists (e.g. "IRB" "0324"): full name, campus building number and map links. No login needed.

Input parameters:

- `building` (string, required): Building code as shown on a section, e.g. "IRB"
- `room` (string, required): Room number as shown on the section, e.g. "0324"; the lookup needs one

Output parameters:

- `campus_map_url` (string|null): Link to the building on the UMD campus map
- `code` (string): Building code, e.g. "IRB"
- `google_maps_url` (string|null): Link to the building on Google Maps
- `name` (string): Building name, e.g. "Brendan Iribe Center"
- `number` (string|null): Campus building number, e.g. "432"
- `picture_url` (string|null): Photo of the building
- `room` (string|null): Room number as given, e.g. "0324"
- `room_info_url` (string|null): Link to the room in 25Live

### `testudo_get_current_term` (~36 tokens)

Get current term

The current academic term at UMD with its registration status and key dates, from the Testudo student portal. Requires login.

Output parameters:

- `dates` (object): Key dates of the term; a date is null when the portal leaves it unset
- `id` (string): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026
- `name` (string): e.g. "Fall 2026"
- `status`: Where today falls relative to the schedule adjustment, registration and graduation application windows; null when the portal omits it

### `testudo_list_terms` (~121 tokens)

List terms

Terms the signed-in student can use with a given Testudo feature: "schedule" lists terms with a class schedule (use with testudo_get_schedule), "grades" terms with posted grades, "enrollment_certification" terms an enrollment certification can be ordered for, "graduation" every term a graduation date can fall in, "graduation_application" terms open for a graduation application, and "grade_option" terms with an open pass/fail election window. Requires login.

Input parameters:

- `kind` (string, required): Which feature's term list to return

Output parameters:

- `terms` (array): Terms in the order the portal lists them

### `testudo_get_schedule` (~117 tokens)

Get schedule

The signed-in student's class schedule for a term from the Testudo student portal: each registered section with its instructors, credits, delivery method and weekly meetings (days, times, building and room). Use testudo_list_terms with kind "schedule" for the terms available. Requires login.

Input parameters:

- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `courses` (array): Registered sections in the order the portal lists them; empty when not registered
- `student` (object)
- `term` (string): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

### `testudo_get_grades` (~114 tokens)

Get grades

The signed-in student's grades for a term from the Testudo student portal: final grades once posted, mid-term grades while the term runs, and the semester and cumulative GPA. Use testudo_list_terms with kind "grades" for the terms available. Requires login.

Input parameters:

- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `academic_action` (string|null): Academic action (probation, dismissal, dean's list, ...) recorded for the term; null if none
- `final_grades` (array): Courses with final grades; empty until grades are posted
- `gpa`: null until the term has posted grades
- `midterm_grades` (array): Courses with mid-term grades; empty outside the mid-term window
- `term` (string): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

### `testudo_get_unofficial_transcript` (~52 tokens)

Get unofficial transcript

The signed-in student's unofficial transcript from the Testudo student portal, as plain text: transfer credit, every past course with its grade, and current courses. For advising purposes only. Requires login.

Output parameters:

- `as_of` (string|null): Date the transcript was generated, as printed (MM/DD/YY)
- `text` (string): The transcript as fixed-width text, section headers included

### `testudo_get_profile` (~47 tokens)

Get profile

The signed-in student's contact information on file with the university, from the Testudo student portal: name, email, phone numbers, local and permanent addresses and emergency contact. Requires login.

Output parameters:

- `email` (string|null)
- `emergency_contact`
- `gender` (string|null)
- `local_address`
- `name` (string|null)
- `permanent_address`
- `phones` (object)
- `uid` (string|null): University id

### `testudo_get_registration_appointment` (~66 tokens)

Get registration appointment

When the signed-in student may register for classes, from the Testudo student portal: the registration appointment for the upcoming term, any blocks on the account, and the majors, minors and certificates on record. Read-only; this does not register for anything. Requires login.

Output parameters:

- `appointment`: The registration appointment; null when none is assigned yet
- `blocks` (array): Registration blocks on the account as the portal lists them; empty when none
- `certificates` (array)
- `current_term`
- `majors` (array)
- `minors` (array)
- `next_appointment_available`: When the next appointment date will be published, if the portal announces one
- `next_registration_term`
- `previous_registration_term`
- `primary_major` (object): The primary major on record
- `registration_term`: Term the appointment registers for
- `student_type` (string|null): e.g. "Undergraduate"
- `uid` (string|null): University id

### `testudo_get_request_status` (~56 tokens)

Get document request status

Status of the official transcript and enrollment certification orders the signed-in student has placed through the Testudo student portal, and any judicial or financial block that would stop new orders. Read-only; ordering is not supported. Requires login.

Output parameters:

- `blocks` (object): Blocks that prevent transcript and certification requests
- `enrollment_certification_requests` (array): Enrollment certification orders, as the portal lists them
- `transcript_requests` (array): Official transcript orders, as the portal lists them

### `testudo_get_graduation_application_status` (~57 tokens)

Get graduation application status

The signed-in student's graduation applications from the Testudo student portal: the term applied for, the diploma name and mailing address, and the status of each degree. Read-only; applying is not supported. Requires login.

Output parameters:

- `applications` (array): Applications on file; empty when the student has not applied

### `testudo_get_grade_options` (~139 tokens)

Get grade options

The grading option (regular or pass/fail) the signed-in student has elected for each course in a term, from the Testudo student portal, with the pass/fail credit totals. Only populated while the term's election window is open; use testudo_list_terms with kind "grade_option" to find such terms. Read-only; changing an option is not supported. Requires login.

Input parameters:

- `term_id` (string, required): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

Output parameters:

- `options` (array): One entry per course; empty outside the election window
- `pass_fail_credits` (object): Totals the portal shows; both null when it shows none
- `term` (string): Four-digit year followed by "01" (Spring), "05" (Summer), "08" (Fall) or "12" (Winter), e.g. "202608" for Fall 2026

### `testudo_get_parent_access` (~43 tokens)

List parent access

Parent or guest accounts the signed-in student has granted access to their Testudo records. Read-only; granting or revoking access is not supported. Requires login.

Output parameters:

- `accounts` (array): Accounts with access; empty when none

### `athletics_list_sports` (~38 tokens)

List sports

Every varsity sport at Maryland (the Terps, umterps.com) with the ids the other athletics tools take. No login needed.

Output parameters:

- `sports` (array): Varsity sports in site order

### `athletics_list_seasons` (~63 tokens)

List seasons

Past and current seasons a sport has a schedule for, with the schedule id to pass to athletics_get_schedule for a past season. No login needed.

Input parameters:

- `sport_id` (integer, required): Sport id from athletics_list_sports, e.g. 3 for Football

Output parameters:

- `seasons` (array): Newest season first

### `athletics_get_schedule` (~115 tokens)

Get schedule

A Maryland team's schedule and results: every game with date, time, opponent, venue, TV/streaming, and the score once played, plus the team's record. Defaults to the current season; pass a schedule id from athletics_list_seasons for a past one. No login needed.

Input parameters:

- `season_schedule_id` (integer): Schedule id of a past season from athletics_list_seasons (default: current season)
- `sport_id` (integer, required): Sport id from athletics_list_sports, e.g. 3 for Football

Output parameters:

- `conference` (string|null): e.g. "Big Ten"
- `games` (array): Games in date order
- `id` (integer): Schedule id
- `record` (object)
- `season` (string|null): e.g. "2026" or "2025-26"
- `sport`
- `title` (string): e.g. "2026 Football Schedule"

### `athletics_get_game` (~47 tokens)

Get game

One Maryland game by id (from athletics_get_schedule or athletics_get_calendar): opponent, venue, media links and result. No login needed.

Input parameters:

- `game_id` (integer, required): Game id

Output parameters:

- `at_or_vs` (string|null): "at" or "vs"
- `conference_game` (boolean)
- `date` (string): Game date in US Eastern time
- `facility` (string|null): Venue name, e.g. "SECU Stadium"
- `id` (integer): Game id to pass to athletics_get_game
- `location` (string|null): City, e.g. "College Park, MD"
- `media` (object)
- `opponent`
- `preview_story_id`: Pass to athletics_get_article
- `recap_story_id`: Pass to athletics_get_article
- `result`: null until the game has been played
- `sport`
- `starts_at` (string|null): Start as an ISO 8601 UTC timestamp
- `state` (string|null): Site game state, e.g. "SCHEDULED", "GAMECOMPLETE"
- `status` (string)
- `time` (string|null): Start time as printed, e.g. "8 PM"; null when TBA
- `tournament` (string|null): Tournament name when part of one
- `type` (string): "regular_season", "exhibition", "postseason" or the site's own code
- `venue` (string)

### `athletics_get_roster` (~65 tokens)

Get roster

A Maryland team's current roster: players with jersey number, position, class, height, weight, hometown and major, plus the coaching staff. No login needed.

Input parameters:

- `sport_id` (integer, required): Sport id from athletics_list_sports, e.g. 3 for Football

Output parameters:

- `coaches` (array)
- `id` (integer)
- `players` (array)
- `season` (string|null)
- `sport`
- `title` (string): e.g. "2026 Football Roster"

### `athletics_search_players` (~102 tokens)

Search players

Find current and former Maryland athletes by last name, across all seasons on umterps.com, optionally within one sport. No login needed.

Input parameters:

- `last_name` (string, required): Start of the last name, e.g. "Lock" or just "L"
- `page` (integer): Page number, starting at 1 (default 1)
- `sport_id` (integer): Sport id from athletics_list_sports, e.g. 3 for Football

Output parameters:

- `pages` (integer): Number of pages of matches
- `players` (array): Matches in alphabetical order
- `total` (integer): Total matches, across all pages

### `athletics_get_coaches` (~53 tokens)

Get coaches

A Maryland team's coaching staff with titles, email, phone and bio page links. No login needed.

Input parameters:

- `sport_id` (integer, required): Sport id from athletics_list_sports, e.g. 3 for Football

Output parameters:

- `coaches` (array): Head coach first

### `athletics_get_news` (~104 tokens)

Get news

Latest Maryland Athletics news stories, newest first, optionally for one sport. Pass a story id to athletics_get_article for the full text. No login needed.

Input parameters:

- `page` (integer): Page number, starting at 1 (default 1)
- `page_size` (integer): Maximum number of records to return, 1-50 (default 10)
- `sport_id` (integer): Sport id from athletics_list_sports, e.g. 3 for Football

Output parameters:

- `pages` (integer): Number of pages at this page size
- `stories` (array): Stories on the requested page, newest first
- `total` (integer): Total stories matching

### `athletics_get_article` (~52 tokens)

Get article

The full text of a Maryland Athletics news story (game recaps, previews, announcements) by story id. No login needed.

Input parameters:

- `story_id` (integer, required): Story id from athletics_get_news or a game

Output parameters:

- `byline` (string|null)
- `content` (string): Story body as plain text
- `date` (string): Published, ISO 8601 in US Eastern time
- `id` (integer): Story id to pass to athletics_get_article
- `image_url` (string|null)
- `links` (array): Related links the story carries
- `sport` (string|null): e.g. "Football"
- `sport_id`
- `subheadline` (string|null)
- `teaser` (string|null): Plain-text teaser
- `title` (string)
- `url` (string): Story page

### `athletics_get_calendar` (~91 tokens)

Get calendar

Every Maryland game or event in a date range across all sports (or one sport), grouped by day, with opponents, venues, media links and results. No login needed.

Input parameters:

- `from` (string, required): First day of the range
- `sport_id` (integer): Sport id from athletics_list_sports, e.g. 3 for Football
- `to` (string, required): Last day of the range

Output parameters:

- `days` (array): Days with at least one event

### `athletics_get_upcoming_events` (~79 tokens)

Get upcoming events

A Maryland team's next few games with date, time, opponent, venue and where to watch. No login needed.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-20 (default 5)
- `sport_id` (integer, required): Sport id from athletics_list_sports, e.g. 3 for Football

Output parameters:

- `events` (array): Soonest first

### `athletics_get_live_scores` (~38 tokens)

Get live scores

Maryland games in progress right now with their live scores, as the site reports them; empty when nothing is being played. No login needed.

Output parameters:

- `games` (array): Live games exactly as the site's LiveStats feed returns them; empty when none

### `calendar_search_events` (~203 tokens)

Search campus events

Events on the UMD campus calendar (calendar.umd.edu) in a date range, optionally narrowed by full-text query, event type, audience or featured status. Recurring events are expanded into occurrences. Returns the total so the caller can page with offset. No login needed.

Input parameters:

- `audience` (string): Only events for this audience
- `end` (string): Only events on or before this date (default: no limit)
- `event_type` (string): Only events of this type
- `featured` (boolean): Only featured events when true
- `limit` (integer): Maximum number of records to return, 1-100 (default 10)
- `offset` (integer): Number of records to skip, for pagination (default 0)
- `query` (string): Full-text search over title and body, plain words, e.g. "gis"
- `start` (string): Only events on or after this date (default: today)

Output parameters:

- `events` (array): Events in start-date order
- `total` (integer): Events matching the filters, across all pages

### `calendar_get_event` (~78 tokens)

Get a campus event

One event from the UMD campus calendar by id or slug, with its full description, location, contact and recurrence rule. No login needed.

Input parameters:

- `id` (integer): Event id from calendar_search_events
- `slug` (string): URL slug, e.g. "terps-after-dark-3"; used when id is not given

Output parameters:

- `all_day` (boolean)
- `audiences` (array): Audience categories (unknown new ones are dropped)
- `calendar` (string): Which of the site's calendars the event is in
- `contact` (object)
- `description` (string|null): Full description as plain text
- `end` (string): ISO 8601 with the America/New_York offset, e.g. "2026-10-01T14:00:00-04:00"
- `event_types` (array): Event-type categories (unknown new ones are dropped)
- `featured` (boolean): true when the site marks the event as featured
- `id` (integer): Event id to pass to calendar_get_event
- `image_url` (string|null): Hero image; append ?w=&h=&fit=crop to resize
- `location` (object)
- `multi_day` (boolean)
- `posted` (string|null): When the event was published, e.g. "2026-08-27 10:49:00"
- `recurrence`: Recurrence rule; null for a one-off event
- `slug` (string): URL slug; also accepted by calendar_get_event
- `start` (string): ISO 8601 with the America/New_York offset, e.g. "2026-10-01T14:00:00-04:00"
- `summary` (string|null): Short blurb as plain text
- `tags` (array)
- `title` (string)
- `url` (string): Public page on calendar.umd.edu

### `calendar_list_categories` (~39 tokens)

List event categories

The event-type, audience and status categories the UMD campus calendar files events under, with the slugs calendar_search_events accepts. No login needed.

Output parameters:

- `categories` (array): Categories in the order the site lists them

### `calendar_get_academic_calendar` (~112 tokens)

Get academic calendar

The approved UMD semester calendars from the Office of the Provost: first and last day of classes, breaks, reading day, final exams, commencement and summer sessions for each academic year, several years ahead. Dates are as printed (no year; the season and academic year give it). No login needed.

Input parameters:

- `year` (string): Only academic years whose name contains this text, e.g. "2027" or "Fall 2026 - Summer 2027" (default: all)

Output parameters:

- `years` (array): Academic years in the order the provost lists them

### `dining_get_busy_meter` (~71 tokens)

Get dining hall busy meter

Current crowd level (less, moderately or extremely busy) of the three UMD dining halls, from the service behind the "Dining Hall Status" page. The service has been returning errors; when it does, `available` is false and the UMD mobile app is the alternative. No login needed.

Output parameters:

- `available` (boolean): false when the crowd-level service did not answer
- `halls` (array): Crowd level per dining hall; empty when unavailable
- `reason` (string|null): Why it is unavailable; null when available

### `dining_get_calendar` (~42 tokens)

Get dining calendar

Key dates for the current semester from UMD Dining Services: when dining plans go live, holiday and break hours, closures and Dining Dollar expiry. No login needed.

Output parameters:

- `events` (array): Events in the order the page lists them
- `title` (string|null): The calendar heading, e.g. "Fall 2026 - Subject to Change"

### `dining_get_news` (~57 tokens)

Get dining news

The newest posts on dining.umd.edu, mainly "The Dish" monthly newsletter, from its RSS feed. No login needed.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-10 (default 10)

Output parameters:

- `items` (array): Newest first

### `directory_search` (~125 tokens)

Search the directory

Search the UMD campus directory for people by last name (prefix; "Pin*" wildcards work), full name, email address, Directory ID or phone number. No login needed for faculty, staff and affiliates (at most 50 results); after login students are included and up to 100 are returned.

Input parameters:

- `query` (string, required): Last name, full name, email, Directory ID or phone number, e.g. "Pines"
- `sounds_like` (boolean): Also match last names that sound like the query, e.g. "Pynes" for Pines

Output parameters:

- `count` (integer): Number of people returned
- `limit_reached` (boolean): true when the directory capped the results (50 anonymously, 100 signed in); narrow the search to see the rest
- `message` (string|null): Notice the directory showed instead of results, e.g. "No users found"; null otherwise
- `people` (array): Matching people in the order the directory lists them

### `directory_search_advanced` (~196 tokens)

Advanced directory search

Search the UMD campus directory by separate name parts, email, work phone, department, affiliation and institution. At least one of the name, email or phone fields is required; department only narrows another field. No login needed for faculty, staff and affiliates; students are only included after login.

Input parameters:

- `affiliations` (array): Affiliations to include (default: faculty, staff and affiliate, plus student when signed in)
- `department` (string): Department name to narrow by, e.g. "Computer Science"
- `email` (string): Email address
- `first_name` (string): First name
- `institutions` (array): Institutions to include (default: UMCP only)
- `last_name` (string): Last name (prefix match)
- `middle_name` (string): Middle name
- `phone` (string): Work phone, digits or dashed, e.g. "301-405-5803"

Output parameters:

- `count` (integer): Number of people returned
- `limit_reached` (boolean): true when the directory capped the results (50 anonymously, 100 signed in); narrow the search to see the rest
- `message` (string|null): Notice the directory showed instead of results, e.g. "No users found"; null otherwise
- `people` (array): Matching people in the order the directory lists them

### `directory_get_person` (~80 tokens)

Get a person

Look up one person in the UMD campus directory by Directory ID (the part of their email before @umd.edu). No login needed for faculty, staff and affiliates; students are only found after login.

Input parameters:

- `directory_id` (string, required): UMD Directory ID (the part of the email before @umd.edu), e.g. "djpines"

Output parameters:

- `person`: The person, or null when the directory has no match

### `elms_whoami` (~37 tokens)

Who am I on ELMS

The signed-in user as ELMS (Canvas) knows them: name, login id, email and time zone. Requires login.

Output parameters:

- `avatar_url` (string|null)
- `email` (string|null)
- `id` (integer): Canvas user id
- `login_id` (string|null): UMD Directory ID; null if Canvas hides it
- `name` (string)
- `short_name` (string|null)
- `sortable_name` (string|null): "Last, First"
- `time_zone` (string|null): e.g. "America/New_York"

### `elms_list_courses` (~70 tokens)

List ELMS courses

The signed-in student's courses on ELMS (Canvas) with term, instructors and current grade standing. Course ids are what the other ELMS tools take. Requires login.

Input parameters:

- `state` (string): "active" for current courses, "completed" for past terms, "all" for both

Output parameters:

- `courses` (array): Courses as Canvas orders them

### `elms_get_course` (~76 tokens)

Get an ELMS course

One ELMS (Canvas) course with its syllabus, front page and the navigation tabs enabled for it, so you know which of assignments, modules, announcements, files or external tools (Zoom, Piazza, Gradescope) exist. Requires login.

Input parameters:

- `course_id` (integer, required): Canvas course id, from elms_list_courses

Output parameters:

- `course_code` (string|null): e.g. "CMSC131-0101-Fall 2026"
- `end_at` (string|null): ISO 8601 timestamp (UTC); null when unset
- `enrollment_type`: The user's role in the course
- `front_page`: The course front page; null when the course has none
- `grades`: Current standing; null when the course hides grades
- `hide_final_grades` (boolean)
- `id` (integer): Canvas course id, used by the other ELMS tools
- `name` (string)
- `start_at` (string|null): ISO 8601 timestamp (UTC); null when unset
- `state` (string): Publication state
- `syllabus` (string|null): Syllabus body, converted from HTML to plain text; null when empty
- `tabs` (array): Navigation tabs enabled for the course, in order
- `teachers` (array)
- `term`
- `url` (string): Course home page

### `elms_list_assignments` (~89 tokens)

List ELMS assignments

Assignments in an ELMS (Canvas) course, ordered by due date, each with the signed-in student's submission status and score. Narrow with a bucket such as "upcoming" or "unsubmitted". Requires login.

Input parameters:

- `bucket` (string): Only assignments in this bucket (default: all)
- `course_id` (integer, required): Canvas course id, from elms_list_courses

Output parameters:

- `assignments` (array)

### `elms_get_submission` (~72 tokens)

Get an ELMS submission

The signed-in student's submission for one ELMS (Canvas) assignment: status, score, grade and any instructor comments. Requires login.

Input parameters:

- `assignment_id` (integer, required): Canvas assignment id, from elms_list_assignments
- `course_id` (integer, required): Canvas course id, from elms_list_courses

Output parameters:

- `attempt`
- `comments` (array): Instructor and student comments, when requested
- `excused` (boolean)
- `grade` (string|null)
- `graded_at` (string|null): ISO 8601 timestamp (UTC); null when unset
- `late` (boolean)
- `missing` (boolean)
- `score` (number|null)
- `state` (string)
- `submitted_at` (string|null): ISO 8601 timestamp (UTC); null when unset
- `url` (string|null): Preview link for the submission

### `elms_get_grades` (~57 tokens)

Get ELMS grades

The signed-in student's current and final scores in every ELMS (Canvas) course they are enrolled in, or in one course. Requires login.

Input parameters:

- `course_id` (integer): Only this course (default: all enrollments)

Output parameters:

- `enrollments` (array)

### `elms_list_modules` (~73 tokens)

List ELMS modules

The modules of an ELMS (Canvas) course with their items (assignments, files, pages, links) and completion state. File items carry the link to lecture slides even when the Files tab is hidden. Requires login.

Input parameters:

- `course_id` (integer, required): Canvas course id, from elms_list_courses

Output parameters:

- `modules` (array): Modules in course order

### `elms_list_announcements` (~92 tokens)

List ELMS announcements

Announcements posted in one or more ELMS (Canvas) courses within a date window (default: the last 14 days). Requires login.

Input parameters:

- `course_ids` (array, required): Courses to read announcements from, up to 20
- `end_date` (string): Latest post date (default: today)
- `start_date` (string): Earliest post date (default: 14 days ago)

Output parameters:

- `announcements` (array): Newest first

### `elms_get_todo` (~39 tokens)

Get ELMS to-do list

Assignments the signed-in student still needs to submit, as ELMS (Canvas) lists them in the to-do sidebar. Requires login.

Output parameters:

- `items` (array)

### `elms_get_planner` (~104 tokens)

Get ELMS planner

Everything due or happening for the signed-in student across all ELMS (Canvas) courses in a date range (default: the next 14 days): assignments, quizzes, announcements, events and notes, with submission status. The best single "what's due" feed. Requires login.

Input parameters:

- `end_date` (string): Last day to include (default: 14 days from today)
- `start_date` (string): First day to include (default: today)

Output parameters:

- `items` (array): In date order

### `elms_get_upcoming_events` (~38 tokens)

Get ELMS upcoming events

Upcoming calendar events and assignment due dates across all ELMS (Canvas) courses, as the Canvas dashboard shows them. Requires login.

Output parameters:

- `events` (array)

### `elms_get_activity_stream` (~61 tokens)

Get ELMS activity stream

Recent activity across the signed-in student's active ELMS (Canvas) courses: new announcements, discussion posts, grades and messages. Requires login.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-50 (default 20)

Output parameters:

- `items` (array): Newest first

### `elms_list_conversations` (~74 tokens)

List ELMS conversations

The signed-in student's ELMS (Canvas) Inbox: conversations with their subject, participants and last message. Requires login.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-100 (default 20)
- `scope` (string): Which Inbox folder to list (default "inbox")

Output parameters:

- `conversations` (array): Most recent first

### `elms_get_conversation` (~45 tokens)

Get an ELMS conversation

One ELMS (Canvas) Inbox conversation with every message in it. Requires login.

Input parameters:

- `conversation_id` (integer, required): Conversation id, from elms_list_conversations

Output parameters:

- `context` (string|null): Course the conversation belongs to, if any
- `id` (integer): Conversation id, for elms_get_conversation
- `last_message` (string|null)
- `last_message_at` (string|null): ISO 8601 timestamp (UTC); null when unset
- `message_count` (integer)
- `messages` (array): Messages, newest first as Canvas orders them
- `participants` (array): Participant names
- `starred` (boolean)
- `state` (string)
- `subject` (string|null)

### `recwell_get_facility_alerts` (~41 tokens)

Get facility alerts

Current RecWell facility alerts: holiday and reduced hours, closures and protocol changes, as headed sections with any hours tables. No login needed.

Output parameters:

- `sections` (array): Content sections in page order
- `title` (string): Page title
- `url` (string): Page URL

### `recwell_list_facilities` (~46 tokens)

List facilities

RecWell facilities with a one-paragraph description and link each, grouped as indoor or outdoor. Use recwell_get_facility for hours tables and details. No login needed.

Output parameters:

- `facilities` (array): Facilities in the order the site lists them

### `recwell_get_facility` (~69 tokens)

Get a facility

A RecWell facility's page: description, regular hours of operation per season (one tab per semester, as tables), access rules, rental and parking information. For today's actual hours use get_facility_hours. No login needed.

Input parameters:

- `facility` (string, required): Which facility page to read

Output parameters:

- `sections` (array): Content sections in page order
- `title` (string): Page title
- `url` (string): Page URL

### `recwell_get_group_fitness_schedule` (~79 tokens)

Get group fitness schedule

The weekly RecWell group fitness class schedule: class, location, instructor, start and end time and registration link, optionally for one weekday. Registration opens 24 hours before a class and needs the free Group Fitness membership. No login needed.

Input parameters:

- `day` (string): Only classes on this weekday (default: the whole week)

Output parameters:

- `classes` (array): Classes in the order the site lists them

### `recwell_list_club_sports` (~44 tokens)

List club sports

Every RecWell club sport with its website, contact email and donation page. Joining means emailing the club and registering on IMLeagues. No login needed.

Output parameters:

- `clubs` (array): Clubs in alphabetical order

### `senate_list_legislation` (~158 tokens)

List legislation

Bills before the University Senate (senate.umd.edu): the current academic year's legislation with where each bill stands and who is reviewing it, or the archive of past bills back to 2001. Filter by words in the title or document number. Call senate_get_bill for a bill's history and documents. No login needed.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-200 (default 50)
- `offset` (integer): Number of records to skip, for pagination (default 0)
- `query` (string): Only bills whose title or document number contains this text
- `scope` (string): "current" for this year's bills (default), "archived" for past years

Output parameters:

- `bills` (array): Newest first
- `total` (integer): Bills matching the query

### `senate_get_bill` (~103 tokens)

Get a bill

One University Senate bill by id or document number: the proposal, sponsor, policy link, related bills, and every stage of its history (committee reviews, Senate votes, presidential approval) with dates, decisions and the PDFs filed at each stage. No login needed.

Input parameters:

- `bill` (string, required): Bill id (e.g. "987") or Senate document number (e.g. "26-27-04"), from senate_list_legislation or senate_get_committee

Output parameters:

- `completed`: When the process finished
- `description` (string|null): The proposal as submitted
- `document_number` (string): Senate document number, e.g. "26-27-04": the academic year and a sequence number
- `id` (integer): Bill id, for senate_get_bill
- `is_active` (boolean): Whether the bill is still moving through the process
- `is_complete` (boolean): Whether the process has finished
- `keywords` (string|null): Keywords the Senate Office tagged the bill with
- `pcc_id` (string|null): Programs, Curricula & Courses (PCC) proposal id, for curriculum bills
- `policy_url` (string|null): The policy the bill concerns, when there is one
- `proposed`: When the proposal was submitted
- `related_bills` (array): Bills the Senate Office linked to this one
- `sponsor` (string|null): Who proposed it
- `stages` (array): The bill's history, most recent stage first
- `start_year`: Calendar year the bill started in
- `title` (string): Bill title
- `url` (string): Bill page on senate.umd.edu

### `senate_list_senators` (~156 tokens)

List senators

Current members of the University Senate with the seat, constituency, college and term end of each. Filter by college or division acronym, population, constituency, or a name search. No login needed.

Input parameters:

- `college` (string): Only senators for this college or division acronym, e.g. "CMNS", "ENGR", "VPSA"
- `constituency` (string): Only senators for this constituency, e.g. "Tenured/Tenure-Track Faculty", "Exempt Staff - Divisions"
- `population` (string): Only senators for this population, e.g. "Faculty" or "Undergraduate Student"
- `query` (string): Only senators whose name, email or seat contains this text

Output parameters:

- `senators` (array): In alphabetical order by name

### `senate_get_constituent` (~108 tokens)

Get a constituent

How the University Senate files a member of the campus community, by UMD Directory ID: their college, department, title, population and constituency. To find who represents them, call senate_list_senators with that constituency, and with the college too when represented_by_college is true, as the site's "Find My Senator" tool does. No login needed.

Input parameters:

- `directory_id` (string, required): UMD Directory ID, the part of a umd.edu email before the @

Output parameters:

- `college` (string|null): College or division acronym
- `constituency` (string): Constituency they vote in, e.g. "Tenured/Tenure-Track Faculty"
- `department` (string|null): Department, e.g. "CMNS-Computer Science"
- `directory_id` (string): UMD Directory ID
- `major` (string|null): Major, for students
- `name` (string): Full name
- `population` (string): Population the Senate files them under, e.g. "Faculty"
- `represented_by_college` (boolean): Whether their constituency elects senators per college, so their senators are those with both this constituency and this college; otherwise the constituency alone
- `title` (string|null): Job title, or null for students

### `senate_list_committees` (~106 tokens)

List committees and councils

The University Senate's standing and special committees, the University councils it seats, and past councils and task forces, each with a one-paragraph summary. Pass a name to senate_get_committee for its charge, members and current work. No login needed.

Input parameters:

- `type` (string): Only "committee" (Senate committees), "council" (University councils) or "past_council" (dissolved councils and task forces); default: all

Output parameters:

- `groups` (array): Committees, then councils

### `senate_get_committee` (~112 tokens)

Get a committee or council

One University Senate committee, University council, or past council or task force by name (from senate_list_committees): its page as text (charge, chair, contact), current members with seats and colleges, and the bills it is reviewing. See senate_list_past_committee_legislation for earlier bills and senate_get_committee_meetings for meeting dates. No login needed.

Input parameters:

- `name` (string, required): Name as senate_list_committees gives it, e.g. "Academic Procedures & Standards"

Output parameters:

- `about` (string|null): The group's page as plain text: charge, chair, contact
- `active_bills` (array): Bills the group is reviewing now
- `links` (array): Links on the page (documents, forms, email addresses)
- `members` (array): Current members; empty for past councils
- `name` (string): Name, to pass to senate_get_committee
- `summary` (string|null): One-paragraph description from the listing page
- `type` (string): "committee" for a Senate standing or special committee, "council" for a University council, "past_council" for a dissolved council or task force
- `url` (string): Page on senate.umd.edu

### `senate_list_past_committee_legislation` (~105 tokens)

List past committee legislation

Every bill each University Senate standing committee has reviewed, grouped by committee and academic year back to 2001, as the Past Committees page lists them: document number, title, whether the bill is still active and when it completed. Optionally one committee. No login needed.

Input parameters:

- `committee` (string): Only this committee, named as senate_list_committees gives it, e.g. "Academic Procedures & Standards" (default: every committee)

Output parameters:

- `committees` (array): Committees in the order the site lists them

### `senate_get_committee_meetings` (~104 tokens)

Get committee meetings

A University Senate standing committee's meeting dates and times for an academic year (default: the current one), with the agendas posted for each; other meeting materials need a committee member login. No login needed.

Input parameters:

- `committee` (string, required): Committee name as senate_list_committees gives it, e.g. "Academic Procedures & Standards"
- `year` (string): Academic year, e.g. "2024-2025" (default: current)

Output parameters:

- `academic_year` (string): Academic year as "YYYY-YYYY", e.g. "2025-2026"
- `meetings` (array): Meetings in date order
- `years` (array): Every academic year with committee folders, newest first

### `senate_get_meetings` (~93 tokens)

Get Senate meetings

The University Senate meeting schedule for an academic year (default: the current one) with the agenda, materials, slides and minutes posted for each meeting, and the years the archive covers. Meetings run 3:15-5:00 PM unless a document says otherwise. No login needed.

Input parameters:

- `year` (string): Academic year, e.g. "2024-2025" (default: current)

Output parameters:

- `academic_year` (string): Academic year as "YYYY-YYYY", e.g. "2025-2026"
- `meetings` (array): Meetings in date order
- `other_documents` (array): Documents filed under the year but not a meeting, e.g. committee reports
- `years` (array): Every academic year with a schedule, newest first

### `terplink_search_organizations` (~129 tokens)

Search organizations

Search the roughly 1,000 active student organizations on TerpLink by name or keyword, optionally within categories from terplink_list_organization_categories. Returns summaries; call terplink_get_organization for contact details. No login needed.

Input parameters:

- `category_ids` (array): Only organizations with any of these ids
- `limit` (integer): Maximum number of records to return, 1-50 (default 20)
- `offset` (integer): Number of records to skip, for pagination (default 0)
- `query` (string): Words to match in the name or description

Output parameters:

- `organizations` (array): Matches in name order
- `total` (integer): Organizations matching the query

### `terplink_get_organization` (~72 tokens)

Get an organization

Full profile of one TerpLink student organization: description, email, type, primary contact, social links and mailing address. No login needed.

Input parameters:

- `organization` (string, required): Website key (e.g. "kedma", from terplink_search_organizations or the public URL) or numeric organization id

Output parameters:

- `address` (string|null): Mailing address on one line
- `categories` (array): Category names, e.g. "SGA Recognized"
- `category_ids` (array): Ids of the categories the organization is in
- `description` (string|null): Full description as plain text
- `email` (string|null): Contact email
- `id` (integer): Organization id
- `image_url` (string|null): Profile picture
- `name` (string): Organization name
- `phone` (string|null): Contact phone
- `primary_contact` (string|null): Name of the primary contact
- `short_name` (string|null): Abbreviation or nickname
- `social_media` (object): Links the organization lists; null where none
- `started`: When the organization was registered
- `status` (string): Registration status, e.g. "Active"
- `summary` (string|null): One-paragraph summary
- `type` (string|null): e.g. "Registered Student Organization - Spring"
- `url` (string): Public TerpLink page
- `website_key` (string): Pass to terplink_get_organization; the last part of the public URL

### `terplink_list_organization_categories` (~48 tokens)

List organization categories

The categories TerpLink files student organizations under (Academic, Cultural/Ethnic, Honor Society, ...). Use the ids with terplink_search_organizations. No login needed.

Output parameters:

- `categories` (array): Categories in name order

### `terplink_search_events` (~227 tokens)

Search events

Search TerpLink events by keyword, date range, hosting organization, category, theme or perk. Upcoming and ongoing events only unless include_past is set. Times are ISO 8601. No login needed.

Input parameters:

- `benefits` (array): Only events offering these perks
- `category_ids` (array): Only events in categories (see terplink_list_event_categories) with any of these ids
- `ends_before` (string): Only events ending before this date
- `include_past` (boolean): Also return events that have already ended (default false)
- `limit` (integer): Maximum number of records to return, 1-50 (default 20)
- `offset` (integer): Number of records to skip, for pagination (default 0)
- `organization_ids` (array): Only events hosted by organizations with any of these ids
- `query` (string): Words to match in the name or description
- `starts_after` (string): Only events starting on or after this date
- `themes` (array): Only events with any of these themes

Output parameters:

- `events` (array): Soonest-ending first
- `total` (integer): Events matching the query

### `terplink_get_event` (~54 tokens)

Get an event

Full details of one TerpLink event: description, venue or meeting link, hosts, categories, perks and RSVP capacity. No login needed.

Input parameters:

- `event_id` (integer, required): Event id from terplink_search_events

Output parameters:

- `address` (object): Where the event is held
- `benefits` (array): Perks advertised, e.g. "Free Food"
- `categories` (array): Category names
- `co_hosts` (array): Ids of every hosting organization
- `description` (string|null): Description as plain text
- `ends_on` (string): End, ISO 8601
- `id` (integer): Event id, for terplink_get_event
- `image_url` (string|null): Event image
- `name` (string): Event name
- `organization` (object): The hosting organization
- `rsvp` (object): RSVP settings and counts
- `rsvp_total` (integer): RSVPs so far
- `starts_on` (string): Start, ISO 8601
- `theme` (string): Theme the host picked
- `url` (string): Public TerpLink page
- `visibility` (string): Who can see the event, e.g. "Public"

### `terplink_list_event_categories` (~44 tokens)

List event categories

The categories TerpLink events are tagged with (Academic, Service, Sports and Recreation, ...). Use the ids with terplink_search_events. No login needed.

Output parameters:

- `categories` (array): Categories as the site orders them

### `terplink_get_news` (~114 tokens)

Get news

News articles student organizations and departments post on TerpLink, newest first, optionally filtered by keyword or organization. Call terplink_get_article for the body. No login needed.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-50 (default 20)
- `offset` (integer): Number of records to skip, for pagination (default 0)
- `organization_id` (integer): Only articles from this organization
- `query` (string): Words to match in the title or body

Output parameters:

- `articles` (array): Newest first
- `total` (integer): Articles matching the query

### `terplink_get_article` (~43 tokens)

Get an article

One TerpLink news article with its full body as plain text. No login needed.

Input parameters:

- `article_id` (integer, required): Article id from terplink_get_news

Output parameters:

- `author` (string|null): Author name
- `body` (string|null): Article body as plain text
- `id` (integer): Article id, for terplink_get_article
- `image_url` (string|null): Cover image
- `organization` (object): The organization that posted the article
- `published` (string): When the article was posted
- `summary` (string|null): Teaser text
- `title` (string): Headline
- `updated` (string): When the article was last edited
- `url` (string): Public TerpLink page

### `terplink_search_service_opportunities` (~97 tokens)

Search service opportunities

Volunteer and community service opportunities listed for UMD students (mirrored from GivePulse), searchable by keyword. Includes past listings. No login needed.

Input parameters:

- `limit` (integer): Maximum number of records to return, 1-50 (default 20)
- `offset` (integer): Number of records to skip, for pagination (default 0)
- `query` (string): Words to match in the title or description

Output parameters:

- `opportunities` (array): Matches as GivePulse orders them
- `total` (integer): Opportunities matching the query

### `transportation_list_routes` (~50 tokens)

List Shuttle-UM routes

Every Shuttle-UM bus route in the current timetable (regular routes such as 104 College Park Metro plus event routes), with whether each runs today, from the published GTFS feed. No login needed.

Output parameters:

- `feed` (object): The timetable the answers come from
- `routes` (array): Routes in id order

### `transportation_get_route` (~95 tokens)

Get a Shuttle-UM route

One Shuttle-UM route with its stops in order (for the most common trip pattern on the given day) and the route polyline, from the published GTFS feed. No login needed.

Input parameters:

- `date` (string): Service date as YYYY-MM-DD (default: today in College Park)
- `route` (string, required): Route id as in transportation_list_routes, e.g. "104" (event routes have longer ids)

Output parameters:

- `color` (string|null): Route colour as a six-digit hex string, e.g. "93c47d"
- `headsign` (string|null): Destination shown on the bus for this pattern
- `id` (string): Route id, e.g. "104"
- `long_name` (string|null): Route name, e.g. "College Park Metro Station"
- `scheduled_today` (boolean): true when at least one trip runs today
- `shape` (array): Route polyline as [longitude, latitude] pairs, thinned to at most 500 points
- `short_name` (string|null): Number or code shown on the bus, e.g. "104"
- `stops` (array): Stops of the most common trip pattern, in order; empty when nothing is scheduled
- `url` (string): DOTS page with the stop list and printed timetable

### `transportation_list_stops` (~107 tokens)

List Shuttle-UM stops

Shuttle-UM bus stops from the published GTFS feed, filtered by a name fragment or by distance from a point. Without a filter, every stop. No login needed.

Input parameters:

- `lat` (number): Latitude to search around
- `lon` (number): Longitude to search around
- `query` (string): Only stops whose name contains this text, e.g. "Stamp"
- `radius_m` (integer): Search radius in metres around lat/lon (default 500)

Output parameters:

- `stops` (array): Matching stops: nearest first for a point search, otherwise by id

### `transportation_get_stop` (~54 tokens)

Get a Shuttle-UM stop

One Shuttle-UM bus stop with its location and every route that serves it, from the published GTFS feed. No login needed.

Input parameters:

- `stop` (string, required): Four-digit stop id, e.g. "1001"

Output parameters:

- `id` (string): Stop id, e.g. "1001"
- `lat` (number|null): Latitude
- `lon` (number|null): Longitude
- `name` (string|null): Stop name, e.g. "Regents Drive Garage"
- `routes` (array): Ids of every route with a trip that serves this stop
- `wheelchair_boarding` (string): Wheelchair access as the feed records it

### `transportation_get_schedule` (~156 tokens)

Get Shuttle-UM departures

Scheduled departures of a Shuttle-UM route on a date, optionally at one stop, from the published GTFS feed. Times are scheduled, not live; real-time arrivals are only in the Transit app. Without a stop only timepoint stops are listed, to keep the answer short. No login needed.

Input parameters:

- `after` (string): Only departures at or after this local time, as HH:MM
- `date` (string): Service date as YYYY-MM-DD (default: today in College Park)
- `route` (string, required): Route id as in transportation_list_routes, e.g. "104" (event routes have longer ids)
- `stop` (string): Only departures from this stop, e.g. "1001"

Output parameters:

- `date` (string): Date as YYYY-MM-DD
- `departures` (array): Departures in time order; stops without a scheduled time are estimates
- `route` (string): Route id
- `service_ids` (array): GTFS service patterns active that day, e.g. "FA26RS Weekday"; empty means no service
- `weekday` (string)

### `transportation_get_service_alerts` (~56 tokens)

Get Shuttle-UM service alerts

Current Shuttle-UM system updates and alerts (detours, schedule changes) and the modified-service notices linked from the DOTS schedules page. Delays are not posted here, only in the Transit app. No login needed.

Output parameters:

- `alerts` (array): System updates and alerts, top first
- `effective` (string|null): Effective-date note under the heading
- `notices` (array): Modified-service notices linked under the season heading
- `season` (string|null): Schedule season heading, e.g. "FALL 2026 SCHEDULES"

### `transportation_get_service_calendar` (~54 tokens)

Get Shuttle-UM service calendar

The Shuttle-UM service calendar for the academic year: for each break, exam week and intersemester period, the dates and whether service is regular or modified, with the notice page for the detail. No login needed.

Output parameters:

- `periods` (array): Periods in the order the page lists them
- `title` (string|null): Page heading, e.g. "SHUTTLE-UM SERVICE CALENDAR: 2025-2026"

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/avivkeller-umd-mcp/umd-mcp#diagnostics

## Score history

- 2026-10-23: 81
- 2026-10-22: 81
- 2026-10-21: 81
- 2026-10-20: 80
- 2026-10-19: 80
- 2026-10-18: 79
- 2026-10-17: 79
- 2026-10-16: 78
- 2026-10-15: 78
- 2026-10-14: 77
- 2026-10-13: 77
- 2026-10-12: 71
- 2026-10-04: 71
- 2026-10-03: 71
- 2026-10-02: 71
- 2026-10-01: 71

## Common questions

### What is the io.github.avivkeller/umd-mcp server?

io.github.avivkeller/umd-mcp is listed in the public MCP registry as io.github.avivkeller/umd-mcp. MCP server exposing University of Maryland data. This page covers its npm package (umd-mcp).

### Is the io.github.avivkeller/umd-mcp server safe to use?

io.github.avivkeller/umd-mcp scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.avivkeller/umd-mcp server expose?

io.github.avivkeller/umd-mcp exposes 100 tools: login, logout, whoami, planetterp_get_course, planetterp_list_courses, and 95 more. Their descriptions and schemas cost roughly 9,284 tokens of context every time the server is loaded.

### Is the io.github.avivkeller/umd-mcp server still maintained?

io.github.avivkeller/umd-mcp is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the io.github.avivkeller/umd-mcp server under?

io.github.avivkeller/umd-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/umd-mcp
- Socket report: https://socket.dev/npm/package/umd-mcp
- Repository: https://github.com/Open-Sourcery-UMD/umd-mcp
- Changelog RSS feed: https://verifymcp.io/servers/avivkeller-umd-mcp/umd-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/avivkeller-umd-mcp/umd-mcp.json
- HTML version of this page: https://verifymcp.io/servers/avivkeller-umd-mcp/umd-mcp
