knu-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@knu-mcpWhat's the cafeteria menu at Baekrok Hall this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
강원대 MCP 서버 (비공식)
강원대학교 춘천캠퍼스의 공개 정보를 조회하는 MCP(Model Context Protocol) 서버입니다. Claude Desktop, Cursor, Cline 등 MCP를 지원하는 클라이언트에서 자연어로 학사일정·학식·공지·버스 정보를 조회할 수 있습니다. 여러 tool을 조합해 "이번주 학식이랑 수강신청 공지 정리해줘" 같은 통합 질문에 한 번에 답하는 것을 목표로 합니다.
강원대는 공식 API가 없어, 이 서버가 사실상 유일한 프로그래매틱 접근점입니다.
⚠️ 비공식 프로젝트입니다. 강원대학교와 무관한 학생 제작 도구이며, 공개 웹페이지 및 공공데이터포털 API에서 정보를 수집합니다. 학교 사이트 구조가 바뀌면 일부 기능이 동작하지 않을 수 있습니다. 로그인이 필요한 정보(수강신청·성적·도서관 좌석 등)는 제공하지 않습니다.
설치
uv syncRelated MCP server: who-will-notify-mcp
로컬 클라이언트 등록 (Claude Desktop 예시)
claude_desktop_config.json에 추가:
{
"mcpServers": {
"kangwon": {
"command": "uv",
"args": ["run", "--directory", "/절대경로/knu-mcp", "knu-mcp"],
"env": { "KNU_BUS_API_KEY": "발급받은_공공데이터포털_인증키" }
}
}
}KNU_BUS_API_KEY는 버스 도착 정보 tool에만 필요합니다(아래 참조). 없으면 버스 tool만 에러를 반환하고 나머지는 정상 동작합니다.
제공 도구
tool | 설명 |
| 학사일정(해당 연도 전체) |
| 학식 식단. restaurant: 백록관/천지관/두리, week: 0=이번주,1=다음주 |
| 3식당 학식 일괄 |
| 학사공지(메인 홈페이지) 최근분에서 제목 검색 |
| 교내 순환버스(두리버스) 시간표. 정규학기만 운영 |
| 두리버스 현재 시각 기준 다음 출발 |
| 시내버스 실시간 도착. stop: 강원대정문/후문/중앙도서관/백록관/학병원/남춘천역/춘천역/시외버스터미널 |
버스 API 키 (get_bus_arrival 전용)
시내버스 실시간 도착은 공공데이터포털 TAGO 버스도착정보 API를 사용합니다.
data.go.kr 로그인 → "국토교통부_(TAGO)_버스도착정보" 활용신청(개발계정, 즉시 승인)
발급된 일반 인증키(Decoding) 를 환경변수
KNU_BUS_API_KEY로 설정
키는 코드에 하드코딩하지 말고 환경변수로만 전달합니다.
전송 모드
기본은 로컬 클라이언트용 stdio. 원격(클라우드/PlayMCP) 배포 시 streamable-http:
KNU_MCP_TRANSPORT=streamable-http PORT=8000 uv run knu-mcp
# 엔드포인트: http://<host>:<PORT>/mcp환경변수: KNU_MCP_TRANSPORT(stdio|sse|streamable-http, 기본 stdio), PORT(http 포트, 기본 8000).
Docker로 배포
원격 배포는 컨테이너 이미지로 하는 것이 간단합니다. streamable-http 전송이 기본으로 설정되어 있습니다.
docker build -t knu-mcp .
docker run -d --restart unless-stopped -p 8000:8000 \
-e KNU_BUS_API_KEY=<공공데이터포털_인증키> knu-mcp
# 엔드포인트: http://<host>:8000/mcpPORT환경변수를 주입하면 그 포트로 뜹니다(클라우드 플랫폼이 자동 주입하는 경우 그대로 동작).이미지에
HEALTHCHECK가 포함되어 있어/mcp핸드셰이크로 상태를 확인합니다.API 키는 이미지에 넣지 말고 런타임에
-e로만 주입하세요.
프로젝트 구조
knu_mcp/
server.py # FastMCP 서버, tool 7개 등록
http.py # 공용 HTTP(get/post) + 10분 TTL 캐시
academic.py # 학사일정 (scheduleData 파싱)
cafeteria.py # 학식 (POST + 표 파싱)
notices.py # 공지 검색 (목록 파싱)
shuttle.py # 두리버스 시간표 / 다음 차
bus.py # 시내버스 실시간 도착 (TAGO API)
tests/ # 파서 단위 테스트 (fixture 기반, 네트워크 안 탐)
scripts/e2e_smoke.py # 실 네트워크 E2E 스모크각 소스 모듈은 하나의 데이터 소스만 담당하며 서로 의존하지 않습니다.
데이터 출처
학사일정·학식·공지·두리버스:
www.kangwon.ac.kr공개 페이지 (스크래핑)시내버스 실시간 도착: 공공데이터포털 국토교통부 TAGO 버스도착정보 API
개발
uv run pytest # 단위 테스트 (네트워크 안 탐, fixture 기반)
KNU_BUS_API_KEY=<키> uv run python scripts/e2e_smoke.py # E2E 스모크 (실 네트워크 왕복)새 기능은 파서 단위 테스트를 먼저 작성(TDD)하고, 외부 사이트/API 실패 시 예외 대신 {"error": ...}를 반환하는 규칙을 따릅니다.
라이선스
MIT
Available Tools
7 toolsget_academic_calendarARead-only
[강원대학교 도우미] 강원대 춘천캠퍼스의 '현재 다가오는 주요 학사일정'을 조회합니다(수강신청·등록·시험·방학·학위수여식 등). 강원대 사이트가 지난 학기나 먼 미래 일정은 제공하지 않으므로 결과에 없을 수 있습니다. year 인자는 하위호환용이며 결과에 영향을 주지 않습니다.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and openWorldHint=true. The description adds valuable behavioral context: the source site may not include certain schedules, and the year argument is ignored—information not in annotations. This goes beyond the structured data without contradicting it.
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?
The description is concise and front-loaded with the core purpose, followed by a useful limitation note and parameter clarification. Every sentence adds value with no 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?
For a simple tool with one optional parameter and no output schema, the description covers purpose, limitations, and parameter behavior. Combined with annotations, the agent has everything needed to select and invoke the tool correctly.
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 for parameters is 0%, but the description explicitly explains the sole parameter 'year' as backward-compatible and having no effect on results. This adds meaningful meaning beyond the schema, which only lists type/default.
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 clearly states a specific verb and resource: '조회합니다' (queries) the 'current upcoming major academic schedules' of Kangwon University Chuncheon Campus, with examples. It is distinct from all sibling tools (cafeteria, notices, shuttle, bus), so no ambiguity.
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?
Provides clear context: intended for current upcoming schedules and explicitly notes limitations (past/far-future schedules may be absent). However, it does not explicitly mention alternatives or when not to use, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bus_arrivalARead-only
[강원대학교 도우미] 강원대 정류소의 시내버스 실시간 도착정보를 조회합니다. stop: 강원대정문/후문/중앙도서관/백록관/학병원/남춘천역/춘천역/시외버스터미널. route 생략 시 전 노선.
| Name | Required | Description | Default |
|---|---|---|---|
| stop | No | 강원대정문 | |
| route | No | 300 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds a list of valid stops and the behavior of omitting route, but doesn't describe return format, whether results are ordered by arrival time, or any live-data characteristics (refresh, latency). With readOnlyHint present, the bar is lower and the added stop list provides some context value.
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 with embedded useful parameter details — efficient and front-loaded with the main purpose. The stop list and route-omission note are valuable and compact. 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?
For a read-only query tool with no output schema and no required parameters, the description covers purpose, valid inputs, and key behavioral switches. It doesn't describe the return payload shape, which would be helpful since there's no output schema, but the read-only nature lowers the completeness burden.
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 0%, so the description carries the burden. It explains the stop parameter's valid values (8 named stops) and route's omission behavior, adding substantial meaning beyond the raw schema which only shows defaults. It does not clarify the route parameter's format (e.g., route number vs name), but covers the key 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 clearly states the tool queries real-time city bus arrival info at Kangwon National University stops, naming specific stops. The verb and resource are specific, but it doesn't distinguish from siblings like get_next_shuttle (which handles shuttle buses) — though the resource difference (city bus vs shuttle) is implicit.
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 lists valid stop values and notes that omitting route returns all routes. It does not explicitly state when to use this vs get_next_shuttle or other bus-related tools, nor when not to use it. Context is implied by the stops being city bus stops rather than shuttle stops.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_next_shuttleBRead-only
[강원대학교 도우미] 강원대 두리버스의 현재 시각 기준 다음 출발 시각(출발지 기준)을 조회합니다. 정규학기만 운영.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true and openWorldHint=true, which signal this is a safe read operation that may return dynamic data. The description adds the '현재 시각 기준' (based on current time) detail and the regular-semester-only operating constraint, which is useful behavioral context. However, it doesn't disclose what happens outside the semester (empty response? error?), nor whether results are sorted or limited to one entry.
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?
The description is a single, efficient sentence that conveys purpose and the operating constraint. It's compact and front-loaded with the core function. Slightly more detail on edge cases (off-semester behavior) could improve it, but for a zero-parameter query tool, this level of brevity is appropriate.
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?
For a zero-parameter, read-only tool with readOnlyHint and openWorldHint annotations, the description provides the essential purpose (next departure). The semester-only constraint is captured. However, given the sibling tools include get_bus_arrival and get_shuttle_schedule which could overlap, the description could better clarify what distinguishes 'next departure by current time' from those alternatives. Also, the off-semester behavior is unspecified.
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 has 0 parameters, so the description carries no parameter documentation burden. The baseline for 0-param tools is 4. The description accurately reflects that no inputs are needed since it queries based on the current time. No schema coverage concern applies here.
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 states the tool queries the next departure time of Kangwon National University's DuRi bus based on the current time ('현재 시각 기준 다음 출발 시각'). It identifies the resource (bus) and the operation (query next departure). However, it doesn't clearly distinguish from sibling tools like get_bus_arrival or get_shuttle_schedule, which could overlap in purpose. The verb '조회' (query) plus resource '두리버스' is reasonably specific, but the relationship to nearby siblings is unclear.
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 mentions '정규학기만 운영' (only operates during regular semesters), which provides some usage context. However, it doesn't explicitly state when to use this vs alternatives like get_bus_arrival or get_shuttle_schedule, nor does it note any exclusions or when NOT to use it. The semester-only constraint is helpful context but no alternatives are named or distinguished.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shuttle_scheduleARead-only
[강원대학교 도우미] 강원대 춘천캠퍼스 교내 순환버스(두리버스) 시간표를 조회합니다. 정규학기에만 운영.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's read-only nature is pre-covered. The description adds the semester-only operational constraint, which is valuable behavioral context beyond structured data. It doesn't contradict annotations. Given the annotations carry the safety burden, a middle score is appropriate as the description adds modest extra context.
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?
The description is a single focused sentence that states purpose and a key constraint efficiently. It's appropriately sized for a zero-parameter read-only tool and front-loads the key identifying information (the university and campus). No wasted words.
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?
For a zero-parameter read-only tool with readOnlyHint and openWorldHint annotations, the description is reasonably complete. It identifies the system (강원대학교 도우미), the resource (순환버스/두리버스 시간표), the campus (춘천캠퍼스), and the operational constraint (정규학기). The sibling differentiation could be stronger, but the scope is clear. Output schema absence doesn't matter much for a schedule list.
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 has 0 parameters, so there's no parameter burden. Baseline is 4 for 0-param tools. The description references the schedule being for the Chuncheon campus specifically, which gives context about what the returned data pertains to, compensating for the absence of filters.
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?
Description clearly states the tool queries the on-campus shuttle bus (두리버스) timetable for Kangwon National University Chuncheon campus, with a specific verb '조회합니다' (query/view). It's distinct from siblings like get_next_shuttle and get_bus_arrival which focus on real-time arrival rather than the schedule. However, it doesn't explicitly differentiate from those siblings.
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 notes the service operates only during regular semester ('정규학기에만 운영'), which is useful usage context. However, it doesn't explicitly state when to prefer this over siblings like get_next_shuttle or get_bus_arrival, nor does it clarify when NOT to use it. The usage context is implied rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_noticesARead-only
[강원대학교 도우미] 강원대 학사공지에서 query가 제목에 포함된 공지를 검색합니다. 사이트가 키워드 검색을 지원하지 않아 최근 pages 페이지(기본 10페이지, 약 160건)를 훑어 제목으로 필터합니다. 더 과거까지 찾으려면 pages를 늘리세요.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pages | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, so the safety profile is already known. The description adds valuable behavioral context beyond annotations: the search is a title-only filter, it relies on scraping recent pages rather than a native search endpoint, and results are limited by the pages parameter (default ~160 items). This effectively discloses the tool's operational constraints and limitations.
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?
The description is a compact, well-organized single sentence that fronts the purpose, then adds a necessary caveat about the missing keyword search and a concrete adjustment instruction. Every sentence earns its place with no redundancy or filler.
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?
For a filtered-lookup tool with readOnlyHint and openWorldHint annotations, the description is largely complete: it states the source, the filtering mechanism, default scope, and how to broaden the search. It does not describe the return value format or pagination details, but since there is no output schema this is a minor gap rather than a critical one for this relatively simple search tool.
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 0%, so the description must compensate. It explains 'query' semantics (search by title containment) and 'pages' semantics (how many pages to scan; increase for older results). 'limit' is not directly explained, but its meaning is reasonably inferable from context. The description adds meaningful value for the two most important parameters beyond the raw 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 clearly states the tool's purpose: searching for 학사공지 notices whose titles contain the query, with a specific scope (강원대학교). It explicitly describes the mechanism (scraping recent pages and filtering by title) and distinguishes from siblings by specifying the resource ('학사공지') and the search semantics. The verb '검색하다' + resource is specific and clear.
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 provides explicit usage guidance: it explains that the site does not support keyword search, so the tool filters recent pages (default 10 pages, ~160 items) by title, and explicitly tells the agent to increase 'pages' to find older items. This gives concrete when-to-use and how-to-extend instructions that are actionable.
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. Dates show when Glama detected each change.
7 tool updates
v0.1.0- First observed
get_academic_calendar - First observed
get_all_cafeteria_menus - First observed
get_bus_arrival - First observed
get_cafeteria_menu - First observed
get_next_shuttle - First observed
get_shuttle_schedule - First observed
search_notices
TDQS
Most tools target distinct resources: notices, bus arrivals, academic calendar, etc. The main overlap is between get_cafeteria_menu and get_all_cafeteria_menus (single vs. all restaurants), and between get_next_shuttle and get_shuttle_schedule (next departure vs. full timetable), but the descriptions make these differences clear.
The naming pattern is predominantly get_<noun>, with one search_notices exception. All names use lower_snake_case and are readable, but the mix of 'get' and 'search' plus the get_ vs get_all_ prefix variation creates minor inconsistency.
Seven tools is well within the ideal 3-15 range for a university information server. Each tool addresses a distinct user need (meals, notices, shuttles, city buses, calendar) without redundancy or bloat.
The tool surface covers the main information needs for the university domain: cafeteria, shuttle, bus, notices, and academic calendar. Minor gaps exist, such as no direct route info for shuttles or detailed notice content retrieval, but these are workable limitations rather than critical dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Public MCP server for discovering open jobs. Search, filter, and get application links.
- LovableOAuthdev.lovable
Official MCP server for Lovable, the AI-powered full-stack app builder.
An MCP server that provides congressional transcripts
An MCP server that integrates with Discord to provide AI-powered features.
Related MCP Servers
- FlicenseAqualityBmaintenanceMCP server for querying Chosun University portal, CLC/e-Class, and OJ systems, providing tools to access academic information, timetables, notices, and more.13-
- FlicenseNot gradedqualityBmaintenanceMCP server that aggregates department notices and provides structured answers to queries about courses, schedules, and academic dates via tool calling.-
- FlicenseNot gradedqualityCmaintenanceMCP server for searching and retrieving Korean contest information. Provides tools to search contests by keyword/category, get details, list categories, and find deadlines.-
- AlicenseNot gradedqualityCmaintenanceMCP server for querying Korean school budget, unit projects, and special plans through the School Alert (학교알리미) open data API.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/LEEseungseok-01/knu-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server