# UMich Dining (npm · umich-dining-mcp)

Menus, traits, allergens, nutrition and hours of the ten University of Michigan dining halls.

- Trust score: 85/100 (high trust)
- Change this week: +14
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `umich-dining-mcp.duckdns.org`: 77/100, [markdown](https://verifymcp.io/servers/esreddy2-umich-dining-mcp/umich-dining-mcp-2.md), [page](https://verifymcp.io/servers/esreddy2-umich-dining-mcp/umich-dining-mcp-2)
- npm · `umich-dining-mcp`: 85/100 (this document), [markdown](https://verifymcp.io/servers/esreddy2-umich-dining-mcp/umich-dining-mcp.md), [page](https://verifymcp.io/servers/esreddy2-umich-dining-mcp/umich-dining-mcp)

## Channel facts

- Registry: `npm`
- Package: `umich-dining-mcp`
- Version: `2.0.0`
- 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-11-05.

- **Supply Chain Security**: 99/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.
  - 3 of 28 dependencies flagged as unhealthy (1 deprecated).
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to esreddy2/UMich-dining-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 6 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 75/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 1591 tokens (~159/item across 10 items; 8 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 29/100
  - Stability check failed: the tool surface changed between 0.1.1 and 2.0.0: 1 tool removals, 1 breaking changes, 2 additions.
- **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 (100% 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 8 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the UMich Dining MCP server?

UMich Dining runs locally as an npm package, launched with npx -y umich-dining-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 esreddy2-umich-dining-mcp -- npx -y umich-dining-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "esreddy2-umich-dining-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "umich-dining-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "esreddy2-umich-dining-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "umich-dining-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add esreddy2-umich-dining-mcp -- npx -y umich-dining-mcp
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add esreddy2-umich-dining-mcp --command npx --arg -y --arg umich-dining-mcp
```

### Hermes

```yaml
mcp_servers:
  esreddy2-umich-dining-mcp:
    command: "npx"
    args: ["-y", "umich-dining-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "esreddy2-umich-dining-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "umich-dining-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add esreddy2-umich-dining-mcp -t stdio -c npx -a -y umich-dining-mcp
```

### Other

```json
{
  "mcpServers": {
    "esreddy2-umich-dining-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "umich-dining-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-11-05 (score 85, +1)

No change was recorded against any check on this day. Stability & Change Management went from 25 to 29.

### 2026-11-03 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 19 to 22.

### 2026-11-01 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 12 to 15.

### 2026-10-30 (score 82, +11)

- [security improvement] Known CVEs: unverified → pass
- [functional improvement] Dependency health: unverified → 0.95

### 2026-10-29 (score 71, −10)

- [security regression] Stability: unverified → fail
- [security regression] Known CVEs: pass → unverified
- [security regression] Tool safety: pass → unverified
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Dependency health: 0.95 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Schema quality: pass → fail
- [functional improvement] Tool coverage: 50% → 100%
- [functional] Package version: 0.1.1 → 2.0.0

### 2026-10-22 (score 81, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-21 (score 66)

First indexed and scored.

## MCP tools (8)

### `list_locations` (~117 tokens)

List dining halls

List the dining halls and their service periods for the day, with whether they are open now. openNow is evaluated at the current campus-local time. The entries are the halls and their service periods for the day. stale means a page was served from an expired cache entry; asOf is the age of the data. Cafes, markets, bakeries, grills, prices and meal plans are out of scope.

Input parameters:

- `date` (string): The day to read. Defaults to today.
- `hall` (string): Keep only this hall.

Output parameters:

- `date` (string)
- `failures` (array)
- `locations` (array)
- `mapUrlTemplate` (string)

### `get_menu` (~197 tokens)

Get a dining hall menu

Get the menu of one dining hall: meals, stations and dishes. Rows: [name, traits, allergens, mhealthyTier, calories, servingSize, servingSizeGrams] plus nutrients. traits/allergens are codes; read key. With no meal, the meal being served now is returned (or next if closed). Date defaults to today; site publishes today-3..+14. stale means expired cache; asOf data age. Allergens advisory.

Input parameters:

- `date` (string): The day to read. Defaults to today.
- `hall` (string, required): The dining hall to read.
- `include_nutrients` (array): Nutrients to return, by key/name, or ["all"].
- `meal`: Keeps only those meals: one name, or a list of them. When it is left out, the meal the hall is serving right now is used.
- `station` (string): Keeps only that station.

Output parameters:

- `asOf` (string)
- `date` (string)
- `hall` (string)
- `key` (object)
- `meals` (array)
- `note` (string)
- `nutrients` (array)
- `renderedDate` (string)
- `stale` (boolean)
- `totalItems` (number)
- `totalStations` (number)
- `units` (object)
- `unknownMealLabels` (array)

### `filter_dishes` (~508 tokens)

Filter dishes

Filter dining hall menus by allergen, trait, nutrient density, carbon, calories, sodium and name. All params optional. Allergens/traits are slugs; read key for codes. min_mhealthy: keep tiers >= (1-5). max_carbon: keep tiers <= (1 low, 2 medium, 3 high). nutrients: range per nutrient. query: case-insensitive substring. Rows are coded arrays; read key. stale means expired cache; asOf data age. Allergens advisory.

Input parameters:

- `date` (string): A single day to filter. Cannot be combined with from/to.
- `exclude_allergens` (array): Keeps only the dishes that carry none of these allergens.
- `from` (string): The first day of a range to filter.
- `hall`: Halls: one, a list, or none for all.
- `include_nutrients` (array): Nutrients to return, by key/name, or ["all"].
- `limit` (integer): Rows to return (default 50, max 500).
- `max_carbon` (integer): The highest acceptable carbon footprint: 1 (low), 2 (medium) or 3 (high). The dishes the site did not tag are dropped.
- `meal` (string): Keeps only that meal.
- `min_mhealthy` (integer): The lowest acceptable nutrient-density tier. The dishes the site did not tag are dropped.
- `nutrients` (object): Range per nutrient, e.g. {"protein":{"min":20,"unit":"g"}}. A constraint drops dishes with no value.
- `offset` (integer): Pages of the range to skip.
- `query` (string): A case-insensitive substring of the dish name.
- `require_traits` (array): Keeps only the dishes that carry every one of these traits.
- `sort_by` (string): Sort field: a nutrient key, carbonFootprint, a micronutrient name, servingSize, mhealthyTier, or a ratio "numerator:denominator" (e.g. "protein:calories", "vitaminA:iron"). Legacy: proteinToCalorie,…
- `sort_order` (string): The direction of the sort. It defaults to desc, so the biggest value comes first.
- `station` (string): Keeps only that station.
- `to` (string): The last day of a range to filter. Defaults to the last published day.

Output parameters:

- `asOf` (string)
- `coverage` (object)
- `date` (string)
- `dateRange` (object)
- `failures` (array)
- `filter` (object)
- `flags` (object)
- `key` (object)
- `matches` (array)
- `noMenu` (array)
- `note` (string)
- `nutrients` (array)
- `stale` (boolean)
- `totalMatches` (number)
- `truncated` (boolean)
- `units` (object)

### `list_nutrition_fields` (~93 tokens)

List nutrition fields

List the canonical nutrient identifiers, their units, the alternative units a threshold may be written in, and the Daily Value basis of the published micronutrients. A constraint on a nutrient excludes the dishes that publish no value for it, and a value the site writes as "trace" or "< 1%" is missing rather than zero. sortFields includes servingSize, mhealthyTier and ratio syntax "a:b".

Output parameters:

- `acceptedUnits` (object)
- `fields` (array)
- `micronutrients` (array)
- `notes` (array)
- `sortFields` (array)

### `get_hours` (~159 tokens)

Get dining hall hours

Get the service periods published for a dining hall on the requested day, plus the regular weekly schedule. Accepts one hall, a list, or none for all (like filter_dishes). today is the day's published service periods and regular is the weekly schedule. A hall that cannot be read is reported in the failures and the other halls are still returned. The response carries the weekday name of the requested date. stale means the data is from cache and may be slightly old, but is still the best available; asOf is the age. Re-call only if you need guaranteed-fresh data.

Input parameters:

- `date` (string): The day to read. Defaults to today.
- `hall`: Halls: one, a list, or none for all.

Output parameters:

- `asOf` (string)
- `date` (string)
- `failures` (array)
- `halls` (array)
- `weekday` (string)
- `weekly` (object)

### `get_dining_occupancy` (~55 tokens)

Dining hall occupancy

Real-time occupancy for monitored dining halls: current count, patron flow, total capacity, and percent full. Only halls with sensors are returned.

Input parameters:

- `hall`: Keep only this hall, or a list of halls.

Output parameters:

- `observedAt` (string)
- `readings` (array)

### `find_open_now` (~139 tokens)

Find halls that are open now

The dining halls that are serving at the given time of day, and the ids of the ones that are not, with the service periods of the day for the halls that are open. Without arguments the current campus-local time is used, and the response says which time it resolved. open carries the hall details and today's periods; closed carries hall ids only. stale means a page was served from an expired cache entry; asOf is the age of the data.

Input parameters:

- `at` (string): The campus-local time of day to look at. Defaults to the current time.
- `date` (string): The day to look at. Defaults to today.

Output parameters:

- `asOf` (string)
- `at` (string)
- `closed` (array)
- `date` (string)
- `failures` (array)
- `open` (array)

### `get_item_nutrition` (~179 tokens)

Get a dish nutrition panel

Get the full nutrition panel of one dish. Name matched case-insensitively; exact match wins, else unique substring. Dish row uses the same coded layout as the sweep tools. Panel values are numbers with one units map; micronutrient amount is the derived amount, with the published percent behind it. asOf data age. Allergens advisory. Use this only when you need the full panel for a single dish. For multiple dishes, use filter_dishes with include_nutrients instead.

Input parameters:

- `date` (string): Date YYYY-MM-DD. Site publishes today-3..+14 days.
- `hall` (string, required): The dining hall to read.
- `item` (string, required): The dish name.
- `meal` (string): Narrow the search to one meal.
- `station` (string): Narrow the search to one station.

Output parameters:

- `allergens` (array)
- `asOf` (string)
- `carbonFootprint`
- `date` (string)
- `hall` (number)
- `key` (object)
- `meal` (number)
- `mhealthyTier` (number|null)
- `name` (string)
- `nutrition` (object)
- `station` (number)
- `traits` (array)
- `units` (object)
- `warning` (string)

## Diagnostics

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

## Score history

- 2026-11-05: 85
- 2026-11-04: 84
- 2026-11-03: 84
- 2026-11-02: 83
- 2026-11-01: 83
- 2026-10-31: 82
- 2026-10-30: 82
- 2026-10-29: 71
- 2026-10-28: 81
- 2026-10-27: 81
- 2026-10-26: 81
- 2026-10-25: 81
- 2026-10-24: 81
- 2026-10-23: 81
- 2026-10-22: 81
- 2026-10-21: 66

## Common questions

### What is the UMich Dining MCP server?

UMich Dining is an MCP server listed in the public MCP registry as io.github.esreddy2/umich-dining-mcp. Menus, traits, allergens, nutrition and hours of the ten University of Michigan dining halls. This page covers its npm package (umich-dining-mcp).

### Is the UMich Dining MCP server safe to use?

UMich Dining scores 85 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. 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 UMich Dining MCP server expose?

UMich Dining exposes 8 tools: list_locations, get_menu, filter_dishes, list_nutrition_fields, get_hours, and 3 more. Their descriptions and schemas cost roughly 1,447 tokens of context every time the server is loaded.

### Is the UMich Dining MCP server still maintained?

UMich Dining is still listed as active in the MCP registry. We last reached this channel on 5 November 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 UMich Dining MCP server under?

UMich Dining declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the UMich Dining MCP server?

VerifyMCP ran 16 checks on UMich Dining, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- npm package: https://www.npmjs.com/package/umich-dining-mcp
- Socket report: https://socket.dev/npm/package/umich-dining-mcp
- Repository: https://github.com/esreddy2/UMich-dining-mcp
- Changelog RSS feed: https://verifymcp.io/servers/esreddy2-umich-dining-mcp/umich-dining-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/esreddy2-umich-dining-mcp/umich-dining-mcp/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/esreddy2-umich-dining-mcp/umich-dining-mcp.json
- HTML version of this page: https://verifymcp.io/servers/esreddy2-umich-dining-mcp/umich-dining-mcp
