UMich Dining
Server Details
Menus, traits, allergens, nutrition and hours of the ten University of Michigan dining halls.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- esreddy2/UMich-dining-mcp
- GitHub Stars
- 0
- Server Listing
- umich-dining-mcp
TDQS
Scored across 7 tools
The core access paths are distinguishable: list_locations is a directory, get_hours is a schedule, get_menu is a full menu dump, search_dishes matches on name, filter_dishes matches on attributes, and get_item_nutrition targets a single dish. The one soft spot is that find_open_now, get_hours and list_locations all surface service periods and open/closed status, so an agent could pick the wrong one for a pure 'what's open' query, though the descriptions make the intended primary output of each fairly clear.
All seven names are snake_case verb_noun pairs (filter_dishes, find_open_now, get_hours, get_item_nutrition, get_menu, list_locations, search_dishes). The verb varies meaningfully with the operation (get for fetch, list for enumeration, search for substring match, filter for attribute predicates), which is predictable rather than inconsistent.
Seven tools is well within the sweet spot for a read-only campus dining server. Each tool maps to a distinct query need (where, when, what's open, what's served, find a dish, filter dishes, inspect nutrition) with no filler.
The domain is fully read-only and the surface covers it end to end: locations/contact info, weekly and daily hours, real-time open status, full menus with traits and allergens, name search, attribute filtering, and per-dish nutrition detail. The descriptions explicitly scope out cafes, prices and meal plans, so there are no unexplained dead ends.
Available Tools
7 toolsfilter_dishesFilter dishesARead-onlyInspect
Filter the dining hall menus by allergen, trait, nutrient density, carbon footprint and calories. exclude_allergens removes dishes that carry any of the listed allergens; require_traits keeps only dishes that carry every listed trait; min_mhealthy is the lowest acceptable nutrient-density tier (3 = Nutrient Dense Medium or better); max_carbon is the highest acceptable carbon footprint; max_calories and max_sodium_mg are numeric caps that exclude dishes without published values. Allergen data is only as good as the site. The menu page flags the allergens the kitchen reported for a dish, but the data does not distinguish "contains" from "may contain", there are no ingredient lists, and it is not safe to treat a missing flag as an absence of the allergen. The site's own guidance is: "Look for the signs posted near each food serving area for a list of menu options with allergens highlighted in red." The "Gluten Free" trait means the dish is made without gluten, not that it is safe for someone with coeliac disease. Dedicated gluten-free pantries exist only at South Quad, East Quad, Mosher-Jordan and Bursley.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Calendar date in YYYY-MM-DD. The site publishes menus for today-3 days to today+14 days. | |
| hall | No | ||
| limit | No | ||
| max_carbon | No | ||
| max_calories | No | ||
| min_mhealthy | No | ||
| max_sodium_mg | No | ||
| require_traits | No | ||
| exclude_allergens | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| matches | Yes | |
| warning | Yes | |
| failures | Yes | |
| totalMatches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint/openWorldHint in annotations, the description carries real behavioral weight: it discloses that numeric caps silently drop dishes lacking published values, that allergen flags are unreliable and indistinguishable between 'contains' and 'may contain', and that the gluten-free trait is not coeliac-safe. This is exactly the kind of caveat an agent needs before trusting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Filter semantics are front-loaded and each sentence carries substantive information, including the safety caveats. It is dense but not padded; the dedicated gluten-free pantry list is the only line that feels more site-trivia than tool guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the filter semantics plus data-quality caveats make the tool safe to invoke. The gaps are minor: no guidance on hall/limit or on choosing this over search_dishes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 11%, so the description must compensate, and it does for six of nine params: exclude_allergens (OR semantics), require_traits (AND semantics), min_mhealthy (tier threshold with an example), max_carbon, max_calories and max_sodium_mg. date/hall/limit are left to the schema, which covers date but not hall or limit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Filter the dining hall menus') plus the exact dimensions being filtered (allergen, trait, nutrient density, carbon, calories). It never differentiates itself from the sibling search_dishes, which is a likely-overlapping verb, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what each filter does but gives no when-to-use guidance and never names or contrasts itself with the alternatives (search_dishes, get_menu). An agent must infer from the sibling names which tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_open_nowFind halls that are open nowARead-onlyInspect
Return the dining halls that are serving at the current time, and the ones that are not, with the service periods of today.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| open | Yes | |
| closed | Yes | |
| failures | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and data-scope profile is covered. The description adds that both open and closed halls are returned along with today's service periods, which is useful framing, but it discloses no freshness/timezone caveats for a tool whose whole value is 'now'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the resource and the temporal scope, then covers the full result shape (serving, not serving, today's periods). No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema present, the description does not need to explain return values, and it correctly stays high-level. The only shortfall is not distinguishing itself from get_hours, which an agent in this sibling set would likely want clarified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document; the baseline for a parameterless tool is 4. Nothing in the description contradicts or is needed for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return) and resource (dining halls) with a clear temporal scope (at the current time) and distinguishes the output into currently-serving vs. not-serving. It never names the obvious sibling get_hours, so the boundary between 'open now' and 'hours' must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'current time' framing implies when to use it (a point-in-time open/closed question), but there is no explicit statement of when to prefer this over get_hours for a schedule or list_locations for a directory. Usage guidance is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hoursGet dining hall hoursARead-onlyInspect
Get the service periods published for a dining hall on the requested day, together with the hall's regular weekly schedule. Without a hall argument every hall is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Calendar date in YYYY-MM-DD. The site publishes menus for today-3 days to today+14 days. | |
| hall | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| halls | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real behavior beyond that: the response combines published service periods for one day with the hall's recurring weekly schedule, and an omitted hall fans out to all halls. Error/empty cases (closed days, out-of-window dates) are still not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler. The core behavior is front-loaded and the optional-argument default follows immediately as the one piece of operational nuance worth stating.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and annotations cover the read-only/open-world profile. It covers the multi-hall default and the composed return content, though it leaves the edge case of dates outside the publication window to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: the date parameter is well documented in the schema (format plus the today-3 to today+14 publication window), while hall has only an enum and no description. The description compensates for the hall gap by stating it is optional and that omitting it returns all halls, but adds nothing about date semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it returns the service periods published for a dining hall on a requested day, plus that hall's regular weekly schedule. That is clearly distinct from get_menu (dishes) and find_open_now (live status), though it never names a sibling to make the distinction explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It hints at usage by noting that omitting the hall argument returns every hall, which tells the agent how to broaden the query. But there is no guidance on when to prefer this tool over find_open_now or get_menu, and no stated conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_item_nutritionGet a dish nutrition panelARead-onlyInspect
Get the full nutrition panel of one dish, including the serving size, calories, the fat, cholesterol, sodium, carbohydrate and protein values and the micronutrients. The dish name is matched case-insensitively; an exact match wins, otherwise a unique substring match is used and an ambiguous name is reported rather than guessed.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Calendar date in YYYY-MM-DD. The site publishes menus for today-3 days to today+14 days. | |
| hall | Yes | The dining hall to read. | |
| item | Yes | The dish name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| hall | Yes | |
| meal | Yes | |
| name | Yes | |
| traits | Yes | |
| station | Yes | |
| warning | Yes | |
| hallName | Yes | |
| allergens | Yes | |
| nutrition | Yes | |
| traitLabels | Yes | |
| mhealthyTier | Yes | |
| carbonFootprint | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint) and scope (openWorldHint), so the bar is lower, but the description goes further by disclosing meaningful lookup behavior: case-insensitive matching, exact-match priority, unique-substring fallback, and that ambiguous names are reported rather than guessed. That is real behavioral context not present in the schema. It stops short of describing not-found behavior or date defaulting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core capability stated first and the matching rules second. The list of nutrition fields is slightly enumerative but earns its place by concretely defining 'full nutrition panel'. Front-loading is good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers the tricky input semantics (naming/ambiguity) that an agent could otherwise get wrong. It is still silent on what happens when no dish matches and on what the omitted 'date' parameter defaults to, which the schema hints at but does not resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds genuine meaning for the 'item' parameter by explaining the matching algorithm and its precedence rules, which the schema's terse 'The dish name' does not convey. Hall and date semantics remain fully delegated to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Get the full nutrition panel of one dish') and enumerates exactly what the panel contains (serving size, calories, fat, cholesterol, sodium, carbohydrate, protein, micronutrients). This clearly separates it from siblings like get_menu and search_dishes, which are about discovery rather than per-dish nutrient detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the caller must already know a dish name and want its nutrition rather than the menu listing. There is no explicit statement of when to prefer this over get_menu or search_dishes, nor any prerequisite guidance. The alternative tools are never named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_locationsList dining hallsARead-onlyInspect
List the ten University of Michigan dining halls with their address, phone, e-mail, map link, the service periods published for the requested day, whether they are serving right now, and whether they have a gluten-free pantry. Cafes, markets, bakeries, grills, prices and meal plans are out of scope.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Calendar date in YYYY-MM-DD. The site publishes menus for today-3 days to today+14 days. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| warning | Yes | |
| failures | Yes | |
| locations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the description's added value is the fixed set of ten locations, the per-day service-period behavior, and the live 'serving right now' flag — all useful context beyond what the annotations state. It doesn't address auth, caching, or what happens for a date outside the publish window, which the schema hints at but the description does not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Opens with the verb and resource, then the field list, then the exclusion sentence — a logical front-loaded order with no filler. The returned-field enumeration is long but each item is meaningful for an agent deciding whether the response is sufficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only list tool with one optional, fully documented parameter, an output schema, and a description that covers scope, returned fields, and the live-status nuance. An agent has everything needed to call it correctly and know when the result is insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a documented YYYY-MM-DD pattern and a stated publish window (today-3 to today+14), so the parameter is fully specified structurally. The description only alludes to the date via 'requested day' and adds no format or range detail beyond the schema, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and a precisely bounded resource (the ten U-M dining halls), then enumerates the fields returned. The scope sentence excluding cafes, markets, bakeries, grills, prices and meal plans makes it unmistakable which locations are covered.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The out-of-scope list clearly tells the agent when NOT to use this tool, and 'the service periods published for the requested day' implies the date-scoped use. However, it never names the sibling that handles the excluded categories (e.g. get_menu for menus, filter_dishes for prices), so routing still requires inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_dishesSearch dishesARead-onlyInspect
Search dish names across the dining halls, or within one hall. The match is a case-insensitive substring match on the dish name.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Calendar date in YYYY-MM-DD. The site publishes menus for today-3 days to today+14 days. | |
| hall | No | Restrict the search to one hall. | |
| limit | No | ||
| query | Yes | Text to look for in the dish names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| query | Yes | |
| matches | Yes | |
| warning | Yes | |
| failures | Yes | |
| totalMatches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuinely useful behavioral semantics beyond that: matching is a case-insensitive substring on dish names, which tells the agent partial queries like 'pizza' will match 'pepperoni pizza slice'. It stops short of describing result ordering, default limit, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. Scope is front-loaded and the matching rule follows immediately, so nothing needs to be re-read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. What remains missing is any signal separating this from filter_dishes and any note on default result count or ordering for a tool with a limit parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% (date, hall, and query are documented; limit is not), so the schema carries most of the load and a baseline of 3 applies. The description adds match semantics for query and reinforces hall scoping, but says nothing about date or limit behavior that would compensate for the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search dish names') plus scope ('across the dining halls, or within one hall'), so the agent knows exactly what is being queried. It does not distinguish itself from the sibling filter_dishes, which is the tool an agent is most likely to confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the 'or within one hall' phrasing hints that the hall parameter narrows scope, but there is no explicit when-to-use statement and no mention of filter_dishes or get_menu as alternatives. An agent must infer the routing decision from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
- First observed
filter_dishes - First observed
find_open_now - First observed
get_hours - First observed
get_item_nutrition - First observed
get_menu - First observed
list_locations - First observed
search_dishes
Related MCP Connectors
Dishes, prices, diets, allergens and this week's lunch menus of places to eat in Austria.
Food logging, nutrition summaries, and meal photo calorie and macro estimates.
Nutrition facts for 24,000+ menu items of 100+ Japanese restaurant chains (kcal, PFC, salt, vitamins), each with the chain's source document. Search items, total a meal, and request missing chains.
- AvocartOAuthio.avocart
Meal plans, USDA-based nutrition and Instacart groceries for every diet in your household.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides real-time access to menus from all six MIT Bon Appétit dining halls. It enables users to query daily or weekly schedules and filter options by specific dietary requirements such as vegan, halal, or gluten-free.25 npm1MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying Yale Hospitality dining menus, listing residential colleges, fetching meal offerings, and searching dishes across colleges via MCP tools.MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to browse and search lunch menus across LUT University's Skinnarila campus restaurants, including vegan and allergen-aware filtering, with clear reasons when menus are unavailable.40MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with the IIIT-H mess dining and marketplace systems through resources, tools, and prompts for meal planning, billing analysis, and registration modifications.27GPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.