MCP server for Soongsil University (SMU) meal, notice, exam, and schedule queries with Korean timezone support
This server has 7 tools, all read-only database queries. Critical issues: (1) Most tool descriptions are in Korean and vague, they state WHAT the tool queries but not WHEN to use it or how it differs from similar tools. (2) Schema quality varies: some tools have well-typed parameters (date_iso, category, keyword, professor), but others lack proper constraints and enums. (3) No output schemas documented, LLMs cannot infer what fields to expect or how to chain results. (4) Parameters use generic names like 'keyword' and 'date_keyword' without clear distinctions. (5) No error handling guidance, tools will fail silently on malformed input or missing data. (6) Naming is inconsistent: query_smu_meals_by_date_category vs query_smu_meals_by_keyword vs query_smu_schedule_by_date, similar structure but different parameter names. (7) Database credentials and connection logic exposed in tool code (DB_HOST, DB_USER, etc. from environment, but no validation). (8) No pagination or result-limiting documented, tools could return massive unfiltered datasets.
Return current date/time info in Asia/Seoul (KST, UTC+9).
smu_exam 테이블에서 subject_name, professor 조건을 조합해 검색.
YYYY-MM-DD 날짜와 카테고리로 smu_meals를 조회한다.
'meal' 텍스트 등에서 키워드 검색 (보조 용도)
'smu_notices' 테이블에서 'title' 컬럼에 특정 키워드를 포함하는 행을 조회하여 결과를 반환하는 도구.
'smu_schedule' 테이블에서 날짜를 키워드로 찾아 해당하는 content를 반환하는 도구.
'smu_schedule' 테이블에서 'content' 컬럼에 특정 키워드를 포함하는 행을 조회하여 결과를 반환하는 도구.
Output schemas completely undocumented. No tool specifies what fields the LLM should expect in responses. Code uses list[dict] and dict generically; LLM cannot know if result contains 'meal_id', 'meal_name', 'meal_content', or unknown fields. This forces the agent to guess and makes chaining tools impossible.
Parameter naming is inconsistent and misleading. query_smu_exam uses 'keyword' for subject_name; query_smu_schedule_by_date uses 'date_keyword' (suggests substring search, not date parsing); query_smu_meals_by_date_category uses 'category' without enum. Similar tools use different parameter names, forcing LLM to reason about mappings.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
No enum constraints for parameters with known valid values. category in query_smu_meals_by_date_category accepts only breakfast|lunch|dinner but is defined as a plain string. This invites hallucinated values (e.g., 'brunch', 'supper'). LLM lacks the format to select from valid options.
Descriptions lack actionable guidance on when to use each tool. All tools state WHAT they query but not WHEN or WHY. query_smu_meals_by_keyword says 'auxiliary use' but doesn't explain when it's better than date_category search. No description hints at error recovery or preconditions.
No error handling or recovery guidance. Tools will silently fail or return empty arrays on malformed input, missing data, or database errors. No tool description explains what to do if a date is invalid, a keyword matches nothing, or the database is unavailable.
No result limiting or pagination documented. Tools query without LIMIT clauses visible; could return 100s or 1000s of records, overwhelming the LLM context window. No tool description states a result cap or how to iterate through large result sets.
Descriptions in mixed languages (English + Korean) with vague phrasing. Korean descriptions are not accessible to English-speaking LLMs and add cognitive load. Some descriptions use terms like 'auxiliary' and '보조 용도' without clarifying when the tool is preferred.
Overlapping tool functionality without clear distinctions. query_smu_meals_by_date_category and query_smu_meals_by_keyword both search meals; query_smu_schedule_by_keyword and query_smu_schedule_by_date both search schedules. LLM may conflate them or waste reasoning cycles deciding which to call.
Database configuration in environment variables but no validation in tool code. If DB_HOST, DB_USER, or DB_PASSWORD are malformed or missing, tools will crash with unhelpful errors. No try-catch or validation in _get_conn().