CAU eclass MCP (중앙대 이클래스)
Provides tools for interacting with Canvas LMS (중앙대 eclass/LearningX), enabling course and assignment lookup, grade retrieval, material and video downloads, assignment submission, exam schedule queries, and syllabus search/retrieval.
cau-eclass-mcp
중앙대학교 eclass를 자연어로. 시험 일정부터 과제 제출까지, LMS 작업을 Claude·Codex 같은 MCP 클라이언트의 도구로 노출하는 서버입니다.
중앙대 eclass(LearningX / Canvas LMS)를 다루는 MCP 서버입니다. 강의·과제·성적 조회, 자료/동영상 다운로드, 과제 제출, 중간·기말시험 시간표 조회, 강의계획서(syllabus) 검색·조회를 하나의 도구 세트로 제공합니다. 인증(secure backend 토큰 캐시 → 만료 시 Playwright 자동 로그인), 타임아웃·재시도, 부분 실패 처리는 서버가 알아서 흡수하므로 클라이언트는 자연어 요청만 던지면 됩니다.
개인 학습·편의용비공식 도구입니다. 본인 계정으로 본인의 학습 데이터에만 사용하세요. 사용에 따른 책임(LMS 이용약관·학칙 등)은 사용자 본인에게 있습니다.
목차
Related MCP server: Campus
한눈에 보기
MCP 클라이언트에서 자연어로 요청하면 서버가 필요한 도구를 조합해 처리합니다.
🙋 이번 주 마감 과제만 알려줘
🤖 (eclass_get_assignments { days_ahead: 7, include_submitted: false } 호출)
이번 주 마감 임박 과제 2건입니다:
• [운영체제] 스케줄러 구현 과제 — 6/16(월) 23:59 마감 · 미제출 · PDF only
• [자료구조] 4주차 퀴즈 — 6/18(수) 23:59 마감 · 미제출
제출하려면 파일 경로를 알려주세요. dry-run으로 먼저 검증해 드릴게요.🙋 운영체제 교재 보통 뭐 써?
🤖 (eclass_search_syllabus → eclass_get_syllabus 호출)
'운영체제' 강의계획서 기준 주교재입니다:
• Operating Systems: Three Easy Pieces — Arpaci-Dusseau
평가비율: 출결 10 / 중간 45 / 기말 45.위 대화는 동작을 보여주기 위한 예시입니다(값은 임의).
주요 기능
영역 | 할 수 있는 것 | 핵심 도구 |
강의 | 이번 학기 교과목 조회(로컬 스냅샷 우선), 이전 학기·예방교육 분리 조회 |
|
과제 | 마감 임박 과제·퀴즈 조회, 상세(제출 유형/확장자/마감) 확인 |
|
과제 제출 | 파일/텍스트 제출 (기본 |
|
성적 | 강의 단위 + 과제별 점수 |
|
자료 | 강의 자료 목록 수집, MCP 서버 로컬 다운로드, 공개 URL handoff 별도 발급 |
|
동영상 | OCS UniPlayer MP4 동영상을 MCP 서버 로컬에 다운로드 |
|
시험 시간표 | 중간·기말시험 공지 PDF 파싱 → 전체 시간표 또는 |
|
강의계획서 | 과목명/교수명으로 검색 → OZ 리포트 PDF를 구조화(교재·평가·주차일정) 조회 |
|
백업 | 강의 스냅샷을 JSON/Markdown으로 내보내기 |
|
진단 | 인증·브라우저·API 사전 점검 |
|
전체 도구 명세와 파라미터는 docs/TOOLS.md를 참고하세요.
시험 시간표 — 단과대 공지(예: 소프트웨어대학)는 학수번호+분반 exact match로, 교양대학 과목은 강의명+분반 정규화 매칭으로 잡습니다(
matched_by로 구분). 학기는YYYY-1(1학기),YYYY-2(2학기),YYYY-S(하계 계절학기),YYYY-W(동계 계절학기)를 지원합니다."2026년 여름 계절학기"같은 한글 입력도 동일한 학기 키로 정규화합니다. 중간시험은exam_type: "midterm", 기말시험은exam_type: "final"(기본값)을 사용합니다.eclass_get_exam_schedule { term: "2026-1", exam_type: "midterm", refresh: true }로 해당 학기의 공지 PDF를 동기화하고 저장된 중간시험 시간표 전체를 한 번에 조회할 수 있습니다.term: "2026-S"로 하계,term: "2025-W"로 동계 시간표를 조회합니다. 동계 키의 연도는 학년도이므로 다음 해 1월 시험도 포함합니다. 기본 전용 소스는 서울캠퍼스 교양대학·소프트웨어대학·경영경제대학이며, 계절학기는 경영경제대학 공식 공지/PDF도 자동 탐색합니다. 다른 공지는source_url로 지정할 수 있습니다(지원 PDF 형식에 한함). 공지 미게시나 파싱 실패는partial_failures와 소스 상태를 확인하세요.강의계획서 — CAU 포털(mportal2)+OZ 리포트 서버에서 받아오며, "OO 과목 교재 보통 뭐 써?" 같은 질문에 학기와 무관하게 답합니다. PDF를
pdftotext로 파싱해 교재·평가비율·주차별 주제를 구조화하고 원문 전체를raw_text로도 제공합니다.
동작 원리
인증은 OS 자격증명 저장소에 캐시된 토큰을 먼저 쓰고 만료됐을 때만 Playwright로 자동 로그인해 토큰을 재발급·캐시합니다. 비밀번호는 OS 자격증명 저장소를 떠나지 않습니다.
flowchart LR
A["MCP 도구 호출"] --> B{"Keychain에 유효 토큰?"}
B -->|"있음"| D["eclass API 호출"]
B -->|"없음 또는 만료"| C["Playwright 자동 로그인"]
C --> E["토큰 재발급 후 Keychain 캐시"]
E --> D
D --> F["구조화 결과 반환"]기능별로 가장 가벼운 백엔드를 우선 쓰고 막히면 브라우저로 폴백합니다.
flowchart TD
S["eclass-mcp 서버"] --> C["Canvas REST API (강의·과제·성적·공지)"]
S --> L["LearningX 내부 API (강의 자료·주차학습)"]
S --> O["OCS UniPlayer (동영상 MP4)"]
S --> M["mportal2 + OZ 리포트 (강의계획서 PDF)"]
C -.->|"읽기 우선, 실패 시"| P["Playwright 폴백"]
L -.-> P요구 사항
Node.js 24.x —
engines로 강제하며preinstall에서 버전을 확인합니다.pnpm 11.6.0 —
packageManager필드와pnpm-lock.yaml로 고정합니다.자격증명 저장소 — 다음 중 하나에 LMS 비밀번호를 저장합니다.
OS 자격증명 저장소 — macOS Keychain / Linux Secret Service(libsecret). 데스크톱 환경 기본값.
암호화 파일 저장소(
secrets.enc) — Keychain/D-Bus가 없는 헤드리스 Linux 서버용. AES-256-GCM으로 암호화하고 마스터 키는 비밀 관리 도구에서 주입하거나 repo 밖의 권한0600파일로 분리합니다. 자세한 내용은 헤드리스 서버: 암호화 백엔드.
Playwright Chromium — 자동 로그인·일부 자료 인터셉트용.
postinstall에서 자동 설치됩니다.pdftotext(poppler) — 시험 시간표·강의계획서 PDF 파싱용. 없으면 시험 동기화가
EXAM_PARSER_UNAVAILABLE을, 강의계획서 조회가SYLLABUS_PARSER_UNAVAILABLE을 부분 실패로 남기고 다른 기능은 정상 동작합니다.macOS:
brew install poppler
빠른 시작
# 1) 설치 — 의존성 + better-sqlite3 rebuild + Chromium 설치(postinstall)
pnpm install --frozen-lockfile
# 2) 빌드 — TypeScript → dist/
pnpm run build
# 3) 셋업 — 자격증명 저장 + MCP 클라이언트 설정 파일 자동 작성
pnpm run setuppnpm run setup은 대화형으로 ID/비밀번호를 받아 비밀번호는 OS 자격증명 저장소에 저장하고
(설정 파일에 평문으로 남기지 않음), MCP 클라이언트 설정에 서버 항목을 써 줍니다.
기본 경로는 로컬 데스크톱용 stdio MCP입니다. ChatGPT remote MCP / Secure Tunnel은
아래의 선택 기능을 실행할 때만 별도로 켭니다.
설정 대상은 자동 감지하거나
--target으로 지정합니다.--target mcp-json→ 프로젝트의.mcp.json(Claude Code 등)--target hermes→ Hermes config--target both--target encrypted→ OS 저장소 대신 암호화 파일 저장소(secrets.enc)에 비밀번호 저장. 헤드리스 서버용 — 아래 참고.
셋업 끝에
doctor점검이 돌며 인증·브라우저·API 상태를 확인합니다(--no-doctor로 생략).doctor는 어떤 자격증명 백엔드가 선택됐고 비밀번호가 조회되는지도 함께 보고합니다.기존 Hermes 호환용
--allow-plaintext-env는 비밀번호만 설정 파일에 명시적으로 저장합니다. Canvas 토큰과 브라우저 세션은 계속 secure backend에 저장되므로 keytar 또는 마스터 키가 주입된 encrypted backend가 반드시 필요합니다.
이전 버전이 프로젝트의 부모 디렉터리에 만든 .mcp.json은 프로젝트 루트 파일이
없고 그 eclass 항목이 현재 checkout을 정확히 가리킬 때만 seed로 읽습니다. 새 설정은
항상 프로젝트 루트에 쓰며 부모 파일은 수정하지 않으므로, migration 안내가 나오면 부모
파일의 오래된 eclass 항목을 확인 후 직접 제거하세요. --config <path>를 지정하면 이
fallback을 사용하지 않습니다. 단일 경로의 의미가 모호한 --target both와 client
config를 수정하지 않는 --target encrypted에는 --config를 함께 쓸 수 없습니다.
생성되는 MCP 서버 항목은 다음 형태입니다. pnpm start는 stdout 배너가 JSON-RPC를
오염시키므로(-32000), 반드시 node로 직접 실행합니다.
{
"mcpServers": {
"eclass": {
"command": "node",
"args": ["<repo>/dist/index.js"],
"env": { "ECLASS_USERNAME": "<your-id>" }
}
}
}설정 후 MCP 클라이언트를 재시작(또는 재연결)하면 도구가 노출됩니다.
헤드리스 서버: 암호화 백엔드
Keychain도 D-Bus(libsecret)도 없는 헤드리스 Linux 서버에서는 OS 자격증명 저장소를
쓸 수 없습니다. 이때는 비밀번호를 AES-256-GCM으로 암호화한 파일(secrets.enc,
기본 경로 ~/.eclass-mcp/secrets.enc)에 저장하고, 마스터 키는 비밀 관리 도구에서 직접
주입하거나 repo 밖의 권한 0600 파일로 분리합니다. 비밀번호는 평문으로
저장되지 않습니다.
# 1) repo 밖에 권한 0600 마스터 키 파일을 생성하고 암호화 백엔드를 셋업
mkdir -p "$HOME/.config/eclass-mcp"
chmod 700 "$HOME/.config/eclass-mcp"
pnpm run setup -- --target encrypted \
--generate-master-key-file "$HOME/.config/eclass-mcp/master.key"
# 2) 이후 서버 실행 시 키 파일 경로를 명시적으로 주입합니다.
ECLASS_USERNAME=<your-id> \
ECLASS_CREDENTIAL_BACKEND=encrypted \
ECLASS_SECRET_KEY_FILE="$HOME/.config/eclass-mcp/master.key" \
node dist/index.js마스터 키 주입 방식은 두 가지입니다.
ECLASS_SECRET_KEY— 비밀 관리 도구가 주입하는 32바이트 키의 base64 문자열.ECLASS_SECRET_KEY_FILE— repo 밖의 권한0600키 파일 경로. raw 32바이트 또는 base64 텍스트 모두 인식합니다. 새 키 파일은--generate-master-key-file <path>로 생성하세요.
백엔드 선택 규칙(ECLASS_CREDENTIAL_BACKEND):
미설정(auto) — 마스터 키가 주입돼 있으면
encrypted, 아니면 keytar(가능 시)를 사용합니다. 둘 다 없으면 평문 파일로 폴백하지 않고 오류를 냅니다.encrypted— 암호화 파일 저장소 강제. 마스터 키가 없으면 조용히 폴백하지 않고 오류를 냅니다.keytar— OS 저장소 강제.file— 기존 평문 저장소를 읽어 migration하기 위한 legacy read-only 모드입니다. 새 credential 저장은 거부합니다.
상태가 헷갈리면 pnpm run doctor가 활성 백엔드·마스터 키 주입 여부·keytar 로드
여부·비밀번호 조회 결과를 한 줄로 보고합니다. 비밀번호 조회 실패 시 오류 메시지에도
어떤 백엔드가 쓰였고 다음에 무엇을 실행해야 하는지가 포함됩니다.
ChatGPT 연결 (선택)
ChatGPT UI나 Responses API의 remote MCP 서버로 붙일 때는 HTTP transport를 사용합니다.
일반 로컬 데스크톱 사용에는 tunnel API key가 필요하지 않습니다. OpenAI Secure MCP
Tunnel을 쓸 때만 Platform Tunnels에서 API key/tunnel id를 발급하고
pnpm run chatgptui로 명시적으로 켭니다
(자세히는 docs/CHATGPT_TUNNEL_SETUP.md).
v1은 개인용 단일 사용자 서버입니다. 서버가 실행되는 머신의 ECLASS_USERNAME과
자격증명 저장소(OS 저장소 또는 암호화 파일)에 저장된 LMS 비밀번호를 사용하며, ChatGPT
사용자별 OAuth linking은 아직 지원하지 않습니다. 헤드리스 Linux 서버라면 OS 저장소
대신 암호화 백엔드로 준비하고 실행 시 ECLASS_SECRET_KEY
또는 ECLASS_SECRET_KEY_FILE을 명시적으로 주입하세요.
# 1) 로컬 stdio 설정과 동일하게 credential store를 먼저 준비
# 데스크톱은 기본 setup이면 충분합니다.
# 헤드리스 서버는 명시적 키 주입 또는 아래 명령을 사용합니다.
# `pnpm run setup -- --target encrypted --generate-master-key-file <path>`
pnpm run setup
# 2) 빌드
pnpm run build
# 3) 로컬 remote MCP 서버 실행
ECLASS_USERNAME=<your-id> \
ECLASS_REMOTE_AUTH_TOKEN=<long-random-token> \
node dist/index.js --http --port 8787
# 개발 중 ChatGPT에서 접근할 HTTPS URL 노출
ngrok http 8787ChatGPT에서는 Settings → Apps & Connectors → Advanced settings에서 Developer Mode를
켠 뒤, connector/app 생성 화면에 tunnel URL의 /mcp 경로를 넣습니다.
https://<subdomain>.ngrok.app/mcpHTTP 서버는 다음을 지원합니다.
GET /— health checkPOST/GET/DELETE /mcp— MCP Streamable HTTP transportECLASS_REMOTE_AUTH_TOKEN— 설정 시Authorization: Bearer <token>이 없는/mcp요청을 거부ECLASS_HTTP_ALLOWED_ORIGINS— 콤마로 구분한 CORS origin allowlist. 미설정 시 DNS 리바인딩/로컬 CSRF 방지를 위해Origin헤더가 있는 브라우저 요청은 거부하고,Origin없는 MCP 클라이언트 요청만 허용
로컬에서만 시험할 때는 pnpm run dev:http를 사용할 수 있고, 빌드 후에는
pnpm run start:http가 node dist/index.js --http --port 8787을 실행합니다.
인증 토큰을 비운 HTTP 모드는 동일 머신 loopback 테스트에서만 사용하세요.
reverse proxy, ngrok, SSH/port forwarding으로 노출할 때는 반드시 긴 랜덤
ECLASS_REMOTE_AUTH_TOKEN과 HTTPS 또는 동등한 tunnel 접근 제어를 모두 적용하세요.
Origin/CORS 검사는 인증을 대체하지 않습니다.
도구/metadata 변경 후에는 ChatGPT connector 설정에서 refresh해야 새 descriptor가 반영됩니다.
Tunnel 자동 기동은 pnpm run chatgptui 또는 pnpm run chatgptui:start로 시작하고,
pnpm run chatgptui:status로 pidfile 기반 상태를 확인하며,
pnpm run chatgptui:stop으로 중지합니다.
파일 조회/다운로드 도구는 파일을 ChatGPT에 첨부하지 않습니다. 자료는 먼저 MCP 서버 로컬 캐시에 저장되고, ChatGPT가 파일 내용을 직접 읽어야 할 때만 eclass_file_handoff가 공개 /files/<token> URL을 별도로 발급합니다. 반환 URL이 https://.../files/<token>처럼 외부에서 접근 가능하면 ChatGPT 브라우징으로 그 URL을 직접 열어야 합니다.
사용 예시
자연어 요청 | 서버가 하는 일 |
"이번 학기 기말시험 언제 어디서 보는지 정리해줘" | 시험 동기화 후 |
"이번 학기 중간시험 전체 시간표 보여줘" |
|
"2026년 여름 계절학기 기말시험 시간표 보여줘" |
|
"이번 주 마감 과제만 보여줘" |
|
"운영체제 강의 자료 안 받은 거 다 받아줘" |
|
"이 과제 제출 가능한지 먼저 확인해줘" |
|
"운영체제 교재 보통 뭐 써?" |
|
자주 쓰는 도구 조합 흐름은 docs/TOOLS.md의 "자주 쓰는 조합 흐름"을 참고하세요.
보안
자격증명을 다루는 도구인 만큼 비밀 정보가 새지 않도록 설계했습니다.
🔐 기본
setup은 비밀번호를 OS 자격증명 저장소(Keychain / libsecret) 또는 AES-256-GCM 암호화 파일(secrets.enc)에만 저장하고 평문 파일 backend를 거부합니다. 암호화 파일의 마스터 키는 비밀 관리 도구에서 주입하거나 repo 밖의 권한0600파일로 분리합니다.🚫 평문 env 비밀번호(
ECLASS_PASSWORD)는ALLOW_PLAINTEXT_ENV_SECRETS=1로 명시적으로 켰을 때만 사용되고, 기본값에서는 무시됩니다. 이 override도 Canvas 토큰·세션용 secure backend를 대체하지 않습니다.🙈 인증 토큰·쿠키·CSRF와 제출 파일 바이트는 일반 도구 결과나 디버그 로그에 노출되지 않습니다. 단, stdio의
eclass_file_handoff를 명시적으로 호출하면 선택한 파일 바이트가 MCP 클라이언트에 base64로 전달되고, HTTP 모드에서는 제한시간 URL이 전달됩니다.✅ 과제 제출은 기본
dry_run이고, 기제출 과제는confirm_resubmit없이는 거부하는 이중 제출 방지 게이트가 있습니다.🌐 credential을 동반하는 트래픽은 CAU 도메인 allowlist로 제한하며, 검증된 공개 CDN 요청에는 credential을 전달하지 않습니다.
💾 캐시 DB와 다운로드 파일은 기본적으로 로컬에 저장됩니다. 다만 도구 결과는 연결된 MCP 클라이언트로 전달되며, ChatGPT/Tunnel 사용 시 요청한 결과와 공개 handoff URL은 해당 외부 서비스 경계를 통과합니다.
HTTP 노출, Canvas 액세스 토큰 교체, tunnel 키 최소 권한, 사고 대응 절차는
docs/SECURITY.md를 따르세요.
환경 변수
변수 | 기본값 | 용도 |
| (필수) | eclass 로그인 ID |
|
| 다운로드 저장 위치 |
|
| 다운로드/강의 캐시 DB |
|
| 시험 시간표 전용 DB |
|
|
|
| auto |
|
| (없음) | 암호화 백엔드 마스터 키(32바이트 base64). 실행 시 주입 |
| (없음) | repo 밖의 권한 |
|
| 암호화 비밀번호 파일 경로 |
| 꺼짐 |
|
|
|
|
|
| HTTP transport 포트 |
| (없음) | 설정 시 |
| Origin 요청 기본 거부 | HTTP CORS origin allowlist (콤마 구분) |
| (없음) | OpenAI tunnel 런타임 API 키 (Tunnels Read+Use). |
| (없음) | tunnel 식별자 (Platform Tunnels 발급) |
|
| tunnel-client 프로파일 경로 오버라이드 |
| 꺼짐 |
|
트러블슈팅
증상 | 원인 / 해결 |
MCP 연결 시 |
|
도구가 안 보임 / 실행 안 됨 |
|
시험·강의계획서 PDF 파싱이 비어 있음 |
|
첫 실행 시 키체인 접근 권한 요청 | OS 자격증명 저장소 접근 권한을 허용해야 토큰을 캐시할 수 있습니다. |
헤드리스 서버에서 비밀번호를 못 찾음( | Keychain/D-Bus가 없는 환경입니다. |
로그인·인증이 계속 실패 |
|
개발
pnpm run dev # tsx로 소스 직접 실행
pnpm run dev:http # tsx로 HTTP /mcp 개발 서버 실행 (:8787)
pnpm test # node --test 기반 전체 테스트
pnpm run build # 타입체크 겸 빌드
pnpm run start:http # 빌드된 HTTP /mcp 서버 실행 (:8787)
pnpm run doctor # 인증/브라우저/API 사전 점검
pnpm run discover # 엔드포인트 디스커버리 (docs/DISCOVERY.md)테스트는 현재 사용자가 관찰하는 결과와 안전 조건을 검증합니다. 새 테스트를 추가하거나 기존 테스트를 수정할 때는 다음 기준을 따릅니다.
오류 문구·진단 로그 형식 대신 오류 코드·타입, 종료 상태, 반환 데이터와 저장 결과를 확인합니다.
실행 명령이나 API·브라우저 경로를 고정하기보다 실제 MCP 연결, 자료 반환, 제출 결과를 확인합니다.
과거 디버깅 방식의 흔적, 폐기된 필드의 부재, 개발 문서의 특정 키워드만 검사하는 테스트는 만들지 않습니다.
비밀값 누출, 중복 제출, 잘못된 자료 반환, 기존 데이터 손실을 막는 검사는 유지합니다. 호출 횟수·순서는 실제 부작용을 막는 데 필요한 경우에만 고정합니다.
문서
docs/TOOLS.md— 전체 도구 명세 및 사용 흐름docs/CHATGPT_TUNNEL_SETUP.md— ChatGPT Secure MCP Tunnel 셋업docs/SECURITY.md— 배포 경계, 키 교체, 사고 대응docs/DISCOVERY.md— eclass API 엔드포인트 디스커버리docs/SELF_REPAIR.md— 시험 파서 등 자가 점검·복구 절차
Claude Code 스킬 (선택)
MCP 툴을 정해진 순서로 조합하도록 안내하는 eclass-cau 스킬이 skills/에 동봉돼
있습니다. Claude Code에서 활성화하려면:
pnpm run install:skill~/.claude/skills/eclass-cau를 이 repo로 심볼릭 링크하므로, git pull로 repo를
업데이트하면 스킬도 자동으로 최신 상태가 됩니다. (스킬 본문은 흐름·순서만 담고,
파라미터 명세는 docs/TOOLS.md를 그대로 가리킵니다.)
라이선스
MIT © Jaeseok
CAU(중앙대학교) eclass 전용 비공식 도구입니다. 본인 계정으로 본인의 학습 데이터에만 사용하세요. 이 소프트웨어 사용으로 발생하는 결과(LMS 이용약관·학칙 위반 등)에 대한 책임은 사용자 본인에게 있으며, 저자는 어떠한 보증도 하지 않습니다.
Available Tools
26 toolseclass_doctorDoctorARead-onlyIdempotent
[로컬] 진단 도구. Playwright Chromium 실행 가능 여부를 빠르게 확인합니다. 다른 도구가 인증/브라우저 오류로 실패할 때 원인 파악용으로 사용하세요.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | Yes | |
| checked_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, non-open-world). The description adds genuine context beyond them: that it runs locally and checks the Playwright Chromium runtime specifically, which explains why it is a safe pre-flight/diagnostic step.
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?
Three short sentences, front-loaded with the local/diagnostic framing and followed by the check performed and the usage trigger. No 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?
An output schema exists, so return values need not be explained, and the tool is a parameterless, non-destructive local check. Nothing an agent needs to invoke it correctly is missing.
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?
Zero parameters, so there is nothing for the description to disambiguate; baseline of 4 applies.
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: a local diagnostic that verifies whether Playwright Chromium can launch. This is functionally distinct from every eclass_* data sibling, so an agent can tell it apart immediately.
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?
Explicitly names the trigger condition: use it when other tools fail due to auth or browser errors. That is clear when-to-use guidance, though it does not state when NOT to reach for it (e.g. first-line troubleshooting vs. only after a failure).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_download_fileDownload FileA
[네트워크] 강의 파일을 MCP 서버 로컬 디스크/캐시에 다운로드합니다. 이 도구는 ChatGPT에 파일 본문을 전달하지 않고 local_path/file_id 같은 서버 측 기록만 반환합니다. ChatGPT가 파일을 읽어야 하면 반환된 file_id로 eclass_file_handoff를 호출해 공개 /files/ URL을 발급하고, 그 URL을 브라우징으로 직접 열어야 합니다. 과목과 원본 ID가 일치하는 캐시 파일은 건너뜁니다. acquisition_policy/downloadable을 함께 전달하세요. 동영상/interactive/미확인/잠김은 정상 제외 상태로 반환하며 실제 실패만 isError=true와 JSON error_code/retryable을 반환합니다. 동영상은 eclass_download_video를 사용하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | 다운로드 URL (courseresource 파일은 null 허용 — Playwright로 다운로드) | |
| type | No | 자료 유형. ExternalTool은 LTI 런치 후 실제 파일을 찾습니다. mp4/video/m3u8 계열은 파일 도구에서 거부되며 eclass_download_video 대상입니다. | |
| source | No | ||
| file_id | Yes | Canvas 파일 ID | |
| course_id | Yes | 강의 ID | |
| unlock_at | No | ||
| asset_kind | No | ||
| module_name | No | ||
| display_name | Yes | 저장할 파일명 | |
| downloadable | No | ||
| external_url | No | ||
| locked_for_user | No | ||
| resolution_reason | No | ||
| acquisition_policy | No | ||
| is_playright_required | No | is_playwright_required의 이전 오탈자 별칭. 둘 중 하나면 런치 경로를 탑니다. | |
| is_playwright_required | No | true면 eclass3 래퍼 URL이어도 ExternalTool LTI 런치로 처리합니다. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| status | No | |
| file_id | Yes | |
| message | No | |
| skipped | No | |
| strategy | No | |
| retryable | No | |
| error_code | No | |
| local_path | No | |
| size_bytes | No | |
| next_action | No | |
| display_name | Yes | |
| failure_kind | No | |
| handoff_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the sparse annotations: cached files matching course+original ID are skipped, video/interactive/unresolved/locked items are returned as normal exclusion states rather than errors, and only real failures set isError=true with error_code/retryable. This is rich. A minor gap remains around what local_path/file_id actually contain and permission needs.
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?
Front-loads purpose and scope in the opening sentence, then layers the handoff workflow, cache rule, and error semantics. Dense but every clause carries operational weight; slightly verbose but not padded.
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 detailed, yet the description still explains the returned records and error contract well. For a 16-param tool the main residual gap is per-parameter meaning, but the workflow and behavioral model are complete enough to invoke 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?
With 16 parameters and only 44% schema description coverage, the description compensates for some: it explains the acquisition_policy/downloadable pairing and the file_id's role in handoff. But many parameters (source, unlock_at, module_name, resolution_reason, external_url, locked_for_user, asset_kind) receive no explanation in either schema or description, leaving real gaps.
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 (download a lecture file to the MCP server's local disk/cache) and immediately clarifies the crucial scope distinction: it does NOT deliver the file body to ChatGPT, only server-side records like local_path/file_id. It explicitly distinguishes itself from eclass_download_video and routes reading through eclass_file_handoff.
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?
Explicitly names when to use each alternative: use eclass_file_handoff with the returned file_id to get a public /files/<token> URL when ChatGPT needs to read the file, and use eclass_download_video for videos. It also states prerequisites (pass acquisition_policy/downloadable together) and the cache-skip condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_download_materials_batchDownload Materials BatchA
[네트워크] 여러 파일 자료를 MCP 서버 로컬 디스크/캐시에 한 번에 다운로드합니다 (부분 성공 지원). 이 도구는 ChatGPT에 파일 본문을 전달하지 않고 file_id/local_path 같은 서버 측 기록만 반환합니다. ChatGPT가 파일을 읽어야 하면 각 file_id로 eclass_file_handoff를 호출해 공개 /files/ URL을 발급하고, 그 URL을 브라우징으로 직접 열어야 합니다. eclass_get_materials의 id/title을 file_id/display_name으로 매핑하고 분류·source·잠금 필드를 함께 전달하세요. 동영상 자료는 eclass_download_video로 별도 처리합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | 강의 ID | |
| materials | Yes | 다운로드할 자료 목록 | |
| continue_on_error | No | 실패해도 계속 진행 (기본값: true). false면 첫 실패에서 중단 |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| results | No | |
| summary | No | |
| course_id | No | |
| handoff_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: results are partial-success capable, file bodies are never passed to ChatGPT, only server-side records (file_id/local_path) are returned, and the local cache is the write target. The annotations only give meta-hints (readOnly=false, destructive=false, non-idempotent), so this description carries real disclosure value about side effects and the follow-up workflow.
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?
Core purpose is front-loaded in the first sentence, followed by return-shape, follow-up workflow, input-mapping, and the video exclusion. Information-dense with almost no filler, though the four-sentence block is packed and could be line-structured for faster scanning.
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 needn't be described, and the description still covers side effects, partial success, and the two-step read workflow. It does not explicitly address what happens to locked/needs_resolution or excluded items despite instructing the caller to pass lock fields, leaving a minor gap for edge-case inputs.
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 goes beyond that by telling the caller how to construct the 'materials' entries (map eclass_get_materials id/title → file_id/display_name, and pass classification/source/lock fields together), which meaningfully guides population of a complex nested array.
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 ('여러 파일 자료를 ... 한 번에 다운로드합니다') with an explicit target destination (MCP 서버 로컬 디스크/캐시) and partial-success semantics. It also names the sibling it is not (eclass_download_video) and implicitly distinguishes itself from the single-file eclass_download_file via 'batch/한 번에'. An agent can tell it apart from siblings without opening any schema.
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?
Gives explicit alternatives and the conditions that select them: read the file yourself → call eclass_file_handoff and browse the /files/<token> URL; video content → eclass_download_video. It also directs the caller to source inputs from eclass_get_materials. When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_download_videoDownload VideoA
[네트워크] OCS 메타데이터에서 확인한 직접 MP4 동영상을 검증 후 MCP 서버 로컬 디스크/캐시에 다운로드합니다 (제한시간 30분). 이 도구는 재생·진도·출석 API를 호출하지 않고 동영상 바이트도 ChatGPT에 전달하지 않습니다. 외부에서 받아야 하면 file_id="video:"로 eclass_file_handoff를 호출해 공개 /files/ URL을 별도 발급해야 합니다. 캐시에는 file_id="video:"로 기록되므로 재다운로드 시 eclass_remove_download에 이 형식을 사용하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | https://ocs.cau.ac.kr/em/<content_id> 형식의 OCS 뷰어 URL | |
| type | No | 자료 유형 (참고용) | |
| source | No | 자료 출처 (캐시에 기록됨) | |
| video_id | Yes | 동영상 ID 또는 material id (캐시 키로 사용) | |
| course_id | Yes | 강의 ID | |
| display_name | Yes | 저장할 파일명 (.mp4 없으면 자동 추가) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| message | No | |
| skipped | No | |
| strategy | No | |
| video_id | No | |
| retryable | No | |
| error_code | No | |
| local_path | No | |
| size_bytes | No | |
| display_name | No | |
| handoff_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give write/non-destructive flags, but the description adds substantial context: a 30-minute timeout, that video bytes are NOT relayed to ChatGPT, that playback/progress/attendance APIs are not touched, and how the cache records the entry. This is exactly the beyond-annotations detail an agent needs for a write-to-disk tool.
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?
Front-loaded with the core action and constraint (network, verify, download, 30-min limit), followed by what it deliberately avoids and the sibling routing. Dense but each sentence carries operational information; only the file_id/remove_download clause feels slightly packed into one line.
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 explained, and the description fully covers the behavioral constraints (timeout, no byte relay, no tracking API calls) plus the cross-tool workflow for external delivery and cache cleanup. Nothing needed to invoke it correctly is missing.
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%, so the schema already documents all six parameters and the baseline is 3. The description adds real value by specifying the cache key format 'video:<video_id>' for the video_id parameter, connecting it to handoff and removal semantics beyond what the schema states.
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+resource+scope: verifies a direct MP4 video seen in OCS metadata and downloads it to the MCP server's local disk/cache. It explicitly differentiates from sibling behavior by noting it does NOT call playback/progress/attendance APIs, and names eclass_file_handoff for the external-receipt case.
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?
Clearly frames when to use it (need the video bytes cached locally) versus the alternative path (eclass_file_handoff for a public /files/<token> URL) and the removal path (eclass_remove_download with the video:<video_id> key). The conditions that select each sibling are explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_export_course_snapshotExport Course SnapshotADestructive
[네트워크] 한 강의의 현재 상태(강의 정보, 과제, 공지, 자료, 다운로드 현황, 선택적 성적)를 한 번에 JSON 또는 Markdown으로 내보냅니다. 강의 전반을 훑을 때는 개별 조회 여러 번 대신 이 도구 1회를 사용하세요. output_path 지정 시 파일로 저장(기존 파일은 overwrite=true 없이는 거부).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | 출력 형식 (기본값: json) | json |
| course_id | Yes | 강의 ID | |
| overwrite | No | output_path에 기존 파일이 있을 때 덮어쓸지 여부 (기본값: false — 거부) | |
| output_path | No | 저장 경로 (생략하면 결과에 직접 반환) | |
| include_grades | No | 성적 포함 여부 (기본값: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| format | No | |
| content | No | |
| snapshot | No | |
| course_id | No | |
| local_path | No | |
| partial_failures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as destructiveHint=true and non-idempotent, and the description explains the mechanism: writing to output_path refuses to overwrite an existing file unless overwrite=true. It also flags the [네트워크] network dependency. It does not explain readOnlyHint=false or other side effects, but the key destructive behavior is disclosed.
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?
Three tight sentences with the scope and output formats front-loaded, then the alternative-usage hint, then the file-saving caveat. No filler, though the parenthetical enumeration is dense.
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-format details are not needed. Combined with the annotations, the description covers scope, alternatives, and file-write behavior adequately for a 5-parameter export tool; only the exact structure of the snapshot contents is left implicit.
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 all five parameters are already documented in the schema (format enum, overwrite default false, output_path optional, include_grades default false). The description only restates the overwrite-refusal semantics already present in the schema, adding no new parameter meaning beyond that baseline.
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 (내보냅니다/export) and resource (한 강의의 현재 상태) with an explicit enumeration of what is included (course info, assignments, announcements, materials, download status, optional grades). The scope 'one course, all at once' clearly distinguishes it from the many single-resource siblings like eclass_get_assignments or eclass_get_announcements.
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?
Explicitly says to use this single call instead of repeated individual queries when surveying a whole course, which is real routing guidance. It does not name specific sibling tools or state when NOT to use it (e.g., when only one resource is needed), so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_file_handoffFile HandoffARead-onlyIdempotent
[로컬/URL] 다운로드된 파일 본문을 tool 응답에 첨부하지 않고 /files/ URL만 발급합니다. ChatGPT가 직접 파일을 읽으려면 반환 URL이 공개 인터넷에서 접근 가능해야 하며, localhost/127.0.0.1 URL은 같은 머신의 사용자 브라우저 전용입니다. 공개 handoff가 필요하면 ECLASS_HANDOFF_BASE_URL을 공개 HTTPS reverse proxy/터널 주소로 설정한 뒤 다시 호출하세요. file_id는 eclass_search_downloads/eclass_list_downloads에서 얻습니다. 25MB 초과 파일은 거절됩니다(ECLASS_HANDOFF_MAX_BYTES로 조정).
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | URL을 발급할 로컬 다운로드 파일의 file_id (eclass_search_downloads 결과). 영상은 "video:<id>" 형식. |
Output Schema
| Name | Required | Description |
|---|---|---|
| file_id | Yes | |
| delivered | Yes | |
| mime_type | No | |
| size_bytes | No | |
| display_name | No | |
| download_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description discloses substantial behavior: the 25MB rejection threshold and its env-var override, the localhost-vs-public URL accessibility constraint, and the required configuration for public handoff. These are exactly the operational traits an agent needs and are not in the annotations.
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 core purpose is front-loaded and every sentence carries information (limits, config, sourcing). It is somewhat dense with parenthetical env-var names, but nothing is redundant.
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 no explanation, and the description still covers the source of the input, the size cap, and the networking prerequisite. Nothing an agent needs to call it correctly is missing.
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% for the single parameter, and the schema already documents the file_id source and the 'video:<id>' format. The description's mention of where file_id comes from largely duplicates the schema, so baseline 3 is appropriate.
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 first sentence states a precise verb+resource: it issues a /files/<token> URL without attaching the file body to the response, which is the key distinguishing behavior from the eclass_download_file/eclass_download_video siblings. It does not name those siblings explicitly, so the contrast must be inferred from the 'no body' phrasing.
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 gives a concrete usage path: obtain file_id from eclass_search_downloads/eclass_list_downloads, and if a publicly reachable handoff is needed, set ECLASS_HANDOFF_BASE_URL and re-call. It explains the localhost/127.0.0.1 restriction but never states when to prefer this tool over the direct-download siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_announcementsGet AnnouncementsBRead-onlyIdempotent
[네트워크] 강의 공지사항을 가져옵니다
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 가져올 공지사항 수 (기본값: 20) | |
| course_id | Yes | 강의 ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered. The description's '[네트워크]' tag is the only added behavioral signal (presumably a live network call rather than a cached read), but it is cryptic and unexplained, so the added value is thin.
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 short sentence with no filler and the resource front-loaded. It is efficient, though arguably under-specified rather than optimally sized for a tool that must be distinguished from 25 siblings.
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 and annotations cover behavior, so the description need not explain returns. Still, for a read tool in a crowded eclass namespace it omits the one thing structured fields cannot supply: what the '[네트워크]' qualifier means and when this call is preferable to its siblings.
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% and both parameters (limit with default 20, course_id) are documented in the schema itself. The description adds no format, range, or sourcing information beyond what the schema provides, so the baseline 3 applies.
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 ('가져옵니다'/fetch) and resource ('강의 공지사항'/course announcements), which is enough to separate it from get_assignments, get_grades, and get_materials. However, it offers no explicit differentiation from close siblings such as eclass_get_courses, and the '[네트워크]' prefix is left unexplained.
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?
There is no statement of when to use this tool, what prerequisites exist (e.g. whether course_id must come from get_courses), or which alternative to pick. The only implicit hint is the '[네트워크]' tag, which is never defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_assignment_detailGet Assignment DetailARead-onlyIdempotent
[네트워크] 단일 과제의 상세 정보를 가져옵니다 (제출 유형, 마감/잠금 일시, 배점, 허용 확장자, 제출 여부/일시, 시도 횟수, 점수). 과제 제출 전 확인용.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | 강의 ID | |
| assignment_id | Yes | 과제 ID (eclass_get_assignments의 url에서 확인하거나 과제 목록 참고) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| message | No | |
| retryable | No | |
| assignment | No | |
| error_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered for free. The description adds only the '[네트워크]' network-requirement tag and the returned-field list (which an output schema already carries), and says nothing about auth/permission needs or caching/freshness behavior. It adds light value over the annotations, not rich 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?
Two sentences, front-loaded with the core action and scope, followed by the field list and the usage note. The parenthetical enumeration of return fields is somewhat long but earns its place as a scan-able summary; no filler sentences.
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 needn't explain return values, annotations cover the safety profile, and both parameters are schema-documented with 100% coverage. The only mild gap is the absence of explicit sibling routing, but for a simple two-param read tool the definition is otherwise sufficient to call 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 description coverage is 100% and both parameters (course_id, assignment_id) are documented in the schema, including a hint that assignment_id can be found via eclass_get_assignments. The description adds no parameter-level detail, so the baseline of 3 applies.
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 names a specific verb and resource ('단일 과제의 상세 정보를 가져옵니다' – fetch detail for a single assignment) and enumerates the concrete fields returned (submission type, deadlines, points, allowed extensions, submission status, attempt count, score). The '단일' (single) scope implicitly distinguishes it from the bulk-list sibling eclass_get_assignments, though no sibling is named explicitly.
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?
'과제 제출 전 확인용' gives a clear when-to-use context: check this before submitting, which positions it naturally ahead of eclass_submit_assignment. There are no explicit exclusions or named alternatives, but a competent agent can infer the workflow placement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_assignmentsGet AssignmentsARead-onlyIdempotent
[네트워크] 과제 및 퀴즈 목록을 가져옵니다. course_id 지정 시 submission_types가 포함되며(external_tool=LTI 과제는 API 제출 불가), days_ahead 상한 없이 해당 강의의 미래 마감 과제가 전부 반환됩니다.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | 강의 ID (생략하면 전체 강의) | |
| days_ahead | No | 몇 일 이내 마감 과제를 가져올지 (기본값: 30) | |
| include_submitted | No | 제출한 과제 포함 여부 (기본값: true) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, but the description adds real behavioral context beyond them: course_id causes submission_types to be included, LTI (external_tool) assignments cannot be submitted via the API, and the days_ahead cap is lifted for a specified course. These are non-obvious traits an agent could not infer from structured fields.
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 dense, front-loaded sentences with no filler; the network tag and core operation lead, followed by the conditional caveats. Efficient, though the parenthetical LTI note packs multiple concerns into one clause.
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 annotations cover the safety profile. The description covers the key parameter interactions; only minor gaps remain (behavior when course_id is omitted, pagination/result-size handling).
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% so the baseline is 3, but the description adds meaning beyond the schema by explaining cross-parameter interaction: course_id pulls in submission_types and removes the days_ahead upper bound. That interaction is not derivable from the per-parameter schema text alone.
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 ('과제 및 퀴즈 목록을 가져옵니다' – fetch assignment and quiz list), which is clearly a listing operation distinct from the sibling eclass_get_assignment_detail. It does not explicitly name the sibling, so it stops short of a top-tier differentiation score.
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 through condition-dependent behavior (specifying course_id changes the result shape). There is no explicit statement of when to choose this over eclass_get_assignment_detail, and no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_coursesGet CoursesARead-onlyIdempotent
[네트워크] e-Class 강의 목록을 새로 가져옵니다. 기본 current는 term 이름/ID·날짜로 판별한 이번 학기 일반 교과목만 반환하고 현재 강의 캐시를 교체합니다. all은 Canvas의 available/completed active 수강 이력(이전 학기·교육 포함), training은 보수적으로 분류한 예방/의무교육만 반환합니다. 현재 학기를 판별할 수 없으면 전체를 현재라고 오인하지 않고 실패하므로 scope=all로 원본 범위를 확인하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | current(기본): 이번 학기 교과목, all: available/completed active 수강 이력, training: 예방/의무교육 | current |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and closed-world traits. The description adds genuinely useful behavior beyond them: it is a network fetch that replaces the current course cache, it fails loudly instead of misclassifying when the semester is ambiguous, and the training scope is deliberately conservative. Auth/rate-limit behavior is still unstated.
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?
Front-loaded with the '[network]' tag and the core action, then four sentences that each carry distinct information (scope semantics, cache replacement, failure mode, fallback). Dense but every sentence earns its place; no padding.
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 no explanation, and the single-parameter surface is fully covered. The failure mode and cache-replacement side effect are disclosed, leaving only minor gaps such as authentication or rate-limit expectations for a network call.
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% and the single enum is documented, so baseline is 3. The description goes further by explaining the classification logic behind each scope (term name/ID/date detection, Canvas available/completed enrollment history, conservative training classification), adding real meaning beyond the terse schema strings.
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 (fetch fresh) and resource (e-Class course list), and breaks the result set into three named scopes with distinct contents. It implicitly distinguishes itself from eclass_get_courses_cached by noting that it replaces the current cache, but never names that sibling explicitly, so it falls just short of a clean 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?
Gives explicit conditions for choosing each scope (current = this semester's regular courses; all = full Canvas enrollment history; training = prevention/mandatory education) and a concrete fallback: if the semester cannot be determined, use scope=all rather than mislabeling. It stops short of pointing to the cached alternative tool, so no explicit when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_courses_cachedGet Courses CachedARead-onlyIdempotent
[로컬] 캐시의 현재 학기 강의 스냅샷을 조회합니다. 네트워크 호출 없이 course_id ↔ 강의명 매핑에 사용합니다. course_id를 지정한 exact lookup은 이전 학기 catalog도 찾습니다. 캐시가 비어 있거나 학기가 바뀐 경우 eclass_get_courses의 기본 current 조회로 갱신하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | 특정 강의 ID만 조회 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile and the no-network property are partly covered. The description still adds real behavior beyond that: exact lookup by course_id also searches previous-semester catalogs, and stale/empty cache states require a refresh via another tool.
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?
Four short sentences, front-loaded with the local/cache scoping and the mapping use case, then the lookup nuance, then the refresh fallback. No filler, though the '[로컬]' tag and the refresh sentence could be tightened slightly.
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 explained, and the annotations carry the safety profile. The description covers staleness, refresh routing and the exact-lookup nuance, leaving only minor gaps such as behavior when course_id matches nothing.
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% for the single course_id parameter, so the baseline is 3. The description adds genuine meaning beyond the schema by explaining that a course_id exact lookup reaches into previous-semester catalogs, which is not conveyed by the parameter description.
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 a specific verb and resource ('캐시의 현재 학기 강의 스냅샷을 조회') and immediately scopes it as local/cache-only with no network calls. It also explicitly distinguishes itself from the sibling eclass_get_courses, so an agent can tell the two apart without opening either schema.
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 names the intended use case (course_id ↔ 강의명 mapping without network calls) and gives an explicit fallback condition: if the cache is empty or the semester has changed, refresh via eclass_get_courses's default current query. Both the when-to-use and the alternative are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_download_statusGet Download StatusARead-onlyIdempotent
[로컬] MCP 서버 로컬 캐시의 다운로드 현황을 강의별로 요약 조회합니다. 이 도구는 파일 본문을 반환하지 않습니다. 파일 내용을 보려면 eclass_search_downloads/eclass_list_downloads로 file_id를 찾고 eclass_file_handoff로 공개 URL을 별도 발급해야 합니다. 강의명은 로컬 course cache를 사용합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | 특정 강의 ID 상세 조회 |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| courses | No | |
| downloads | No | |
| handoff_note | No | |
| total_file_count | No | |
| total_size_bytes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, non-open-world behavior. The description adds valuable context beyond that: it returns no file body, it reads only the local cache, and course names come from the local course cache. It does not discuss pagination or freshness/staleness of the cache, which would push it higher.
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?
Front-loaded with the core purpose, followed by the non-return of file contents and the routing to alternatives. Three sentences, each earning its place, though the file-contents caveat is stated twice in slightly different forms.
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-value details need not be repeated, and annotations cover the safety profile. Combined with the explicit non-content and local-cache caveats, the description is nearly complete; only cache staleness or refresh behavior is unaddressed.
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% for the single optional course_id parameter, so the schema already documents it. The description adds only the tangential note that course names resolve via the local course cache, not parameter-level detail. Baseline 3 applies when the schema carries the 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?
States a specific verb and resource: it summarizes per-course download status from the MCP server's local cache. It clearly distinguishes itself from file-fetching siblings by stating it does not return file contents.
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?
Explicitly routes the agent: to see file contents, find file_id via eclass_search_downloads/eclass_list_downloads and issue a public URL with eclass_file_handoff. Both the alternative and the condition that selects it are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_exam_scheduleGet Exam ScheduleARead-onlyIdempotent
[로컬] 저장된 중간/기말시험 시간표를 조회합니다. course_id와 query를 생략하면 해당 term/exam_type의 전체 시간표를 반환합니다. course_id 지정 시 SIS 확정 course_code+분반 exact match를 우선하며, 교양대학 과목(course_code가 PDF에 없음)은 강의명+분반 정규화 매칭으로 fallback합니다(matched_by로 구분). 모두 실패하면 reason=EXACT_MATCH_NOT_FOUND와 함께 전체 후보 목록(candidates)을 반환하므로 호출자가 직접 판단하세요. refresh=true와 term을 함께 주면 먼저 네트워크 동기화 후 조회합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | 학기 필터: YYYY-1, YYYY-2, YYYY-S(하계), YYYY-W(동계). 연도가 포함된 한글 학기명도 지원 | |
| query | No | 강의명/교수명/과목코드 검색어 | |
| refresh | No | 조회 전 시험 공지 동기화 수행. true면 term 필요 | |
| course_id | No | 강의 ID로 조회 | |
| exam_type | No | 시험 종류: midterm(중간), final(기말). 기본값: final | final |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| mode | No | |
| reason | No | |
| matches | No | |
| candidates | No | |
| matched_by | No | |
| refresh_result | No | |
| course_metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the matching priority (SIS course_code+분반 exact match, then lecture-name fallback flagged via matched_by) and the failure contract (reason=EXACT_MATCH_NOT_FOUND plus a candidates list for the caller to decide). The refresh+term network side effect is also stated.
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?
Purpose is front-loaded in the first sentence, followed by omission behavior, matching logic, failure handling, and the refresh caveat. Every sentence carries information, though the density is high enough that it reads as a compact spec rather than a quick orientation.
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, yet the description still explains the matched_by discriminator and the EXACT_MATCH_NOT_FOUND/candidates failure shape, which is what an agent needs to interpret a result. Nothing required to invoke the tool correctly is missing.
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% so the baseline is 3, but the description adds cross-parameter semantics the schema cannot express: omitting course_id/query widens results, course_id changes the matching algorithm, and refresh only works when term is supplied.
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 ('저장된 중간/기말시험 시간표를 조회합니다') and the '[로컬]' marker distinguishes it from the network-syncing sibling eclass_sync_exam_schedules. An agent can tell it apart from the sync and syllabus tools without opening a schema.
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?
Gives concrete conditional usage: omitting course_id/query returns the full term/exam_type schedule, specifying course_id triggers SIS exact-match with a normalization fallback, and refresh=true requires term to sync first. It stops short of naming sibling tools explicitly as alternatives, but the conditions for each mode are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_gradesGet GradesARead-onlyIdempotent
[네트워크] 성적을 가져옵니다. 강의 단위 점수(current/final)와 과제별 점수/제출여부/채점일시를 포함합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | 특정 강의만 조회 (생략하면 전체 강의) | |
| include_assignments | No | 과제별 점수 포함 여부 (기본값: true) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| errors | No | |
| courses | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds the '[네트워크]' marker signaling a live network fetch, which is genuinely useful given cached siblings exist, and it scopes the return content beyond what the annotations say.
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; the tool action and its output scope are front-loaded, so an agent can parse it in a single pass.
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 and annotations cover the safety profile, so the description need not explain return values; it still summarizes the payload usefully. Only the missing sibling differentiation keeps it from fully closing the gap.
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% and both parameters are documented in-schema (course_id filters courses, include_assignments toggles assignment detail), so the baseline is 3. The description does not add syntax or defaulting detail beyond 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?
States a specific verb+resource ('성적을 가져옵니다') and enumerates the returned content (course-level current/final scores plus per-assignment scores, submission status, grading time). It is clear on its own, but it does not explicitly distinguish itself from close siblings like eclass_get_assignments or eclass_get_courses_cached.
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 by the tool's purpose; there is no explicit when-to-use, when-not-to-use, or named alternative. The '[네트워크]' prefix hints it is a live call rather than a cached read, but the description never states this trade-off against eclass_get_courses_cached.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_materialsGet MaterialsARead-onlyIdempotent
[네트워크] 강의 자료 목록/메타데이터를 가져옵니다 (모듈, 파일함, 강의자료실, 외부도구). 강의자료는 주차학습(modulebuilder), LearningX 강의자료실(courseresource), 공지 첨부(announcements), Canvas 모듈/외부 링크(modules/external)에 분산될 수 있으므로 한 source에서 자료를 찾았어도 다른 source를 생략하지 말고 결과를 합쳐 확인합니다. 같은 자료가 여러 source에서 발견되면 하나로 합치고 대표 source와 모든 출처 sources를 반환합니다. 제목만 같은 서로 다른 항목은 합치지 않습니다. 권장 1차 조회는 modulebuilder, courseresource, announcements, modules, external이며, Canvas 기본 파일함(files)은 Files 탭이 노출되거나 사용자가 명시적으로 요청한 경우에만 마지막으로 조회합니다. 중앙대 학생 계정에서 files 401은 권한 거부일 수 있으므로 토큰 만료로 보고 재로그인하지 않습니다. modulebuilder의 not_open placeholder URL은 제외합니다. Canvas 잠금 항목은 acquisition_policy=not_open으로 반환합니다. 모든 항목에 asset_kind/downloadable/acquisition_policy/resolution_reason/fingerprint를 반환하며 downloadable=true와 acquisition_policy=download인 항목만 파일 도구에 전달합니다. ExternalTool은 모듈명으로 분류하지 않으며 resolve_external=true이면 미확인 래퍼를 LTI로 추가 확인합니다. 이 도구는 파일 본문을 다운로드하거나 ChatGPT에 첨부하지 않습니다. 파일은 eclass_download_file/eclass_download_materials_batch로 MCP 서버 로컬 캐시에 받은 뒤, ChatGPT가 읽어야 하면 eclass_file_handoff로 공개 /files/ URL을 별도 발급해야 합니다. 반환값은 { ok, course_id, sources, materials, errors, warnings } JSON 객체이며, 일부 source 실패 시 성공한 자료와 실패 정보를 함께 반환합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| sources | No | 가져올 소스. 생략 시 modulebuilder, courseresource, announcements, modules, external을 조회한다. files는 Files 탭이 보이거나 명시적 요청이 있을 때 마지막으로 별도 조회한다. | |
| course_id | Yes | 강의 ID | |
| resolve_external | No | 미확인 ExternalTool을 LTI로 확인합니다. 파일을 저장하지 않으며 동일 메타데이터의 비재시도 결과는 SQLite에 보존합니다. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| errors | No | |
| sources | No | |
| warnings | No | |
| course_id | No | |
| materials | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior, but the description adds substantial context beyond annotations: multi-source aggregation and merging rules, partial-failure return behavior, exclusion of not_open placeholders, acquisition_policy handling for locked Canvas items, ExternalTool classification and LTI confirmation, and an explicit no-download boundary.
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 purpose is front-loaded, followed by source priority, edge cases, no-download boundary, and downstream flow. It is long but mostly earns its space for a complex aggregation tool; however, some content repeats the schema descriptions and output shape despite an existing output schema.
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?
Complete for a complex cross-source material metadata tool: it covers default and exceptional source handling, merging rules, partial failures, return shape, downstream file-tool boundaries, and important Canvas/Chung-Ang edge cases. No critical invocation context appears missing.
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%, and the input schema already explains sources defaults, files behavior, and resolve_external LTI confirmation. The description largely repeats those points and adds little parameter-specific format or syntax guidance, so the baseline of 3 is appropriate.
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: fetching course material list/metadata, with source domains enumerated in parentheses. It distinguishes itself from sibling tools by explicitly saying it does not download file bodies or attach to ChatGPT, and routes download/attachment needs to eclass_download_file, eclass_download_materials_batch, and eclass_file_handoff.
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?
Gives explicit source priority (modulebuilder, courseresource, announcements, modules, external), when to include files last (Files tab visible or explicit user request), and when not to treat files 401 as token expiry. It also states the downstream condition for passing items to file tools only when downloadable=true and acquisition_policy=download, and names alternatives for actual downloads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_get_syllabusGet SyllabusARead-onlyIdempotent
[mportal] 특정 강의의 강의계획서 본문을 구조화해 반환합니다(교재·평가비율·주차일정·교수정보 등). 입력 키는 eclass_search_syllabus 결과 행을 그대로 넘기세요.
| Name | Required | Description | Default |
|---|---|---|---|
| sust | No | ||
| term | Yes | ||
| year | Yes | ||
| campcd | No | ||
| clssno1 | Yes | 분반 | |
| sbjtno1 | Yes | 학수번호 |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| message | No | |
| document | No | |
| retryable | No | |
| error_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed world, so the safety profile is fully covered. The description adds that the return is structured, but discloses nothing extra about auth needs, rate limits, or failure behavior; a 3 is appropriate with annotations doing the heavy lifting.
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 tightly packed sentences with no waste: purpose first, then the sourcing instruction for inputs. Fully front-loaded and appropriately sized.
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 structure needn't be explained, and annotations cover the safety profile. The description covers purpose and where to source inputs, which is sufficient for a detail-fetch tool, though the undocumented parameters remain unexplained.
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 low (33%): only clssno1 and sbjtno1 carry field labels, while year, term, sust and campcd are undocumented. The description partially compensates by telling the agent the values come from the eclass_search_syllabus result row, but adds no per-field meaning for the undocumented parameters.
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 (returns a specific course's structured syllabus body) and enumerates the returned content (textbook, evaluation ratios, weekly schedule, professor info). It also implicitly differentiates from sibling eclass_search_syllabus by telling the agent to feed this tool that sibling's result rows.
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?
Gives a clear workflow instruction: take the input keys directly from an eclass_search_syllabus result row. This tells the agent when/how this tool is used (detail fetch after a search), but there are no explicit exclusions or when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_list_downloadsList DownloadsARead-onlyIdempotent
[로컬] MCP 서버 로컬 캐시에 저장된 다운로드 기록 전체를 나열합니다. 이 도구는 파일 본문을 반환하지 않습니다. ChatGPT가 파일을 읽어야 하면 file_id로 eclass_file_handoff를 호출해 공개 /files/ URL을 별도 발급해야 합니다. 조건 검색은 eclass_search_downloads, 강의별 요약은 eclass_get_download_status를 사용하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | 강의 ID (생략하면 전체) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely non-obvious behavior: it reads a local cache and never returns file bodies, with the handoff workflow needed to actually read a file. It does not discuss pagination or cache staleness, which would be the next useful detail.
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?
Front-loads the local-cache scope, then the critical 'no file bodies' constraint, then the alternatives. Every sentence carries distinct information 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?
An output schema exists, so return shapes need not be described; the description instead covers the non-obvious gaps (local cache source, absence of file content, handoff path, sibling routing). Nothing needed to invoke it correctly is missing.
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% and the single course_id parameter is fully documented in the schema. The description adds no format or filtering semantics for course_id (and its 'lists all records' phrasing slightly understates that filtering is possible), so the baseline 3 applies.
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 ('lists all download records stored in the local MCP cache') with an explicit scope qualifier ('[local]'). It also names the sibling tools it must not be confused with, so an agent can distinguish it from eclass_search_downloads and eclass_get_download_status without opening schemas.
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?
Explicitly routes the agent: conditional filtering goes to eclass_search_downloads, per-course summaries go to eclass_get_download_status, and reading a file requires eclass_file_handoff with a file_id. Both the when-to-use and the alternatives are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_list_exam_sourcesList Exam SourcesARead-onlyIdempotent
[로컬/네트워크] 시험 공지 소스 목록을 조회합니다. refresh=true면 중앙대 대학 목록에서 단과대 후보를 갱신합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | 공지 소스 후보를 다시 탐색 (기본값: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| sources | No | |
| partial_failures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint=true, idempotentHint=true), but the description adds a real behavioral detail they do not: refresh=true reaches out to the central university (중앙대) list and rewrites the department candidates. That side effect is worth knowing before passing refresh=true, though there is no mention of cost/rate limits or how the refreshed list is persisted.
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 compact sentences with the core purpose front-loaded and the conditional flag behavior immediately after. 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 an output schema present, return values need not be explained, and annotations cover the safety profile. Purpose and the single parameter's effect are both covered; the only gap is that the [로컬/네트워크] tag is not unpacked for the agent.
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% and the single parameter is already described, so baseline would be 3. The description goes slightly further by explaining what refresh actually re-fetches and from where (단과대 후보 from 중앙대 목록), adding meaning beyond the schema's generic "다시 탐색".
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+resource ("시험 공지 소스 목록을 조회합니다" = retrieve the list of exam notice sources) plus a scope tag ([로컬/네트워크]). It is clearly distinguishable from siblings like eclass_sync_exam_schedules or eclass_get_exam_schedule, though it does not explicitly name those alternatives.
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 conditional "refresh=true면 ... 갱신합니다" tells the agent what the flag does but not when to choose this tool over eclass_get_exam_schedule or eclass_sync_exam_schedules. Usage is implied by the purpose rather than stated as when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_remove_downloadRemove DownloadADestructive
[로컬] 다운로드 기록(DB 레코드)만 삭제합니다 — 디스크의 파일은 남습니다. 삭제 후 재다운로드가 가능합니다. 영상 기록의 file_id는 "video:" 형식입니다.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | No | 특정 파일 ID 삭제 | |
| course_id | No | 강의의 모든 기록 삭제 |
Output Schema
| Name | Required | Description |
|---|---|---|
| file_id | No | |
| removed | Yes | |
| course_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description meaningfully extends this by specifying exactly what is destroyed (local DB record only, not the on-disk file) and that re-download remains possible — genuinely clarifying the scope of a destructive op. Auth, rate limits, and the interaction of the two optional params are unaddressed.
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?
Three compact sentences, each earning its place: scope of deletion, re-downloadability, and the file_id format. The most important constraint (files remain) is front-loaded.
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 needn't be described, and the annotations cover the safety profile. The description covers scope and id format adequately, though it leaves the two optional params' mutual exclusivity and the neither-provided case unaddressed.
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%, so baseline is 3, but the description adds real meaning beyond the generic schema labels by documenting the video file_id format ('video:<video_id>'). It does not clarify whether file_id and course_id are mutually exclusive or what happens when neither is supplied.
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 (삭제/remove) and resource (다운로드 기록/DB record) and immediately scopes it: only the DB record is removed, disk files remain. An agent can distinguish this from real file deletion among the download siblings (eclass_download_file, eclass_file_handoff) without opening the schema.
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 line '삭제 후 재다운로드가 가능합니다' implies a use case (clearing history to re-download), but there is no explicit when-to-use/when-not or named alternative among siblings. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_search_downloadsSearch DownloadsARead-onlyIdempotent
[로컬] MCP 서버 로컬 캐시에 다운로드된 파일 기록만 필터 검색합니다 (파일명/강의명/확장자/source/다운로드 날짜 범위). 이 도구는 파일 본문을 반환하지 않습니다. ChatGPT가 파일을 보려면 검색된 file_id로 eclass_file_handoff를 호출해 공개 /files/ URL을 발급하고, 그 URL을 브라우징으로 직접 열어야 합니다. 전체 나열은 eclass_list_downloads, 강의별 요약은 eclass_get_download_status를 사용하세요.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 최대 결과 수 (기본값: 50) | |
| query | No | 파일명 또는 강의명에 대한 부분 일치 (대소문자 무시) | |
| source | No | 자료 출처 필터 (modules/files/courseresource 등). source가 기록된 항목만 매칭됨 | |
| course_id | No | 강의 ID 필터 | |
| extension | No | 확장자 필터 (예: "pdf" 또는 ".pdf") | |
| downloaded_after | No | 이 일시 이후 다운로드 (ISO, 포함) | |
| downloaded_before | No | 이 일시 이전 다운로드 (ISO, 포함) |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | |
| matches | Yes | |
| handoff_note | No | |
| total_matched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds behavior beyond them: it operates on the local cache only and does NOT return file contents. The handoff workflow for actually viewing a file is non-obvious and valuable. No contradiction with annotations.
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?
Front-loads the [로컬] scope and the core action, then the key behavioral caveat (no file contents), then the workflow, then sibling alternatives. Every sentence carries distinct, necessary information with no 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?
An output schema exists, so return-value explanation is unnecessary. The description covers scope, output limitation, downstream workflow, and sibling routing — everything an agent needs to call this 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 description coverage is 100%, so all 7 parameters are already documented. The parenthetical (filename/course/extension/source/date range) merely restates the filterable dimensions the schema defines, adding no syntax or format detail. Baseline 3 is appropriate.
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+resource with explicit scope: filter-searching only the MCP server's local cache of downloaded file records. It distinguishes itself from eclass_list_downloads and eclass_get_download_status by name, so an agent can select it without opening any schema.
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?
Gives explicit when-to-use alternatives: full listing → eclass_list_downloads, per-course summary → eclass_get_download_status. It also explains the downstream workflow (use file_id with eclass_file_handoff to get a /files/<token> URL and open it via browsing), which is exactly the routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_search_syllabusSearch SyllabusARead-onlyIdempotent
[mportal] 강의계획서를 검색합니다. year/term 미지정 시 현재 학기. 후보 목록(학수번호·분반·강의명·교수·단과대·강의시간)을 반환하니 호출자가 판단해 eclass_get_syllabus로 상세를 받으세요.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | subject | |
| term | No | 학기 코드(1/2/S/W). 미지정 시 현재 학기 | |
| year | No | 개설년도(예: 2026). 미지정 시 현재 학기 | |
| query | Yes | 검색어(과목명 또는 교수명) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| items | No | |
| message | No | |
| retryable | No | |
| error_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and non-open-world, so the safety profile is covered. The description adds real behavioral context beyond that: the default-to-current-term behavior when year/term are omitted and the shape of the candidate list returned.
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?
Three short sentences, front-loaded with purpose, then default behavior, then return content and routing. No filler; each sentence contributes actionable information.
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 search tool with an output schema present, the description covers purpose, default term, return content and the downstream call, which is nearly complete. The remaining gap is clarifying how the 'by' search mode (subject vs professor) changes behavior.
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?
With 75% schema description coverage, the schema already documents year and term, and the description largely repeats the year/term default already stated in the schema. The 'by' enum (subject/professor) is never explained in the description, so it adds little semantic value.
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 (검색/search) and resource (강의계획서/syllabus), including the [mportal] scope. It explicitly distinguishes itself from the detail sibling eclass_get_syllabus by describing itself as returning a candidate list rather than full details.
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?
Clearly routes the agent: it returns candidates so the caller can decide and then call eclass_get_syllabus for details, and it states the year/term default. It does not, however, say when to pick this over other search siblings like search or eclass_get_courses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_submit_assignmentSubmit AssignmentADestructive
[네트워크] 과제를 제출합니다. 기본 dry_run=true로 실제 제출하지 않고 검증만 수행하며, 재제출은 confirm_resubmit=true가 필요합니다. online_upload(file_paths)/online_text_entry(body)만 지원 — submission_types가 external_tool(LTI)인 과제는 제출 불가하므로 eclass_get_assignment_detail로 먼저 확인하세요. API 실패 시 UI 폴백은 단일 파일만 지원합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | 본문 제출 내용 (online_text_entry) | |
| comment | No | 제출 코멘트 | |
| dry_run | No | true면 실제 제출하지 않고 검증만 수행 (기본값: true) | |
| course_id | Yes | 강의 ID | |
| file_paths | No | 업로드할 로컬 파일 경로 목록 (online_upload) | |
| assignment_id | Yes | 과제 ID | |
| confirm_resubmit | No | 이미 제출된 과제 재제출 확인 플래그 |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| mode | No | |
| attempt | No | |
| message | No | |
| strategy | No | |
| retryable | No | |
| error_code | No | |
| validation | No | |
| submitted_at | No | |
| verification | No | |
| is_resubmission | No | |
| already_submitted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description goes well beyond that: it discloses the dry-run default that prevents real mutation, the resubmission guard flag, the unsupported LTI case, and a UI fallback limited to a single file. These are concrete operational behaviors an agent needs before invoking a destructive tool.
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?
Four tightly packed sentences with zero filler; the network tag and action lead, followed by the safety default. Slightly dense, but each clause (dry_run, confirm_resubmit, LTI limits, fallback) carries distinct information.
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 destructive mutation tool with 7 parameters, the description covers prerequisites, unsupported cases, safety defaults, and fallback behavior. An output schema exists, so return values need no explanation, and the annotations already carry the safety profile.
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%, so the baseline is 3, but the description adds cross-parameter relationships the schema cannot express: file_paths maps to online_upload, body maps to online_text_entry, and confirm_resubmit gates resubmission. That is real semantic value beyond the per-field descriptions.
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+resource ("과제를 제출합니다" / submits the assignment) and immediately scopes what submission types are valid. It also names the sibling to consult first (eclass_get_assignment_detail), so an agent can separate it from read-only siblings like eclass_get_assignment_detail or eclass_get_materials without opening a schema.
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?
Gives explicit when/when-not: default dry_run=true validates without submitting, resubmission requires confirm_resubmit=true, and external_tool (LTI) assignments cannot be submitted at all. It also routes the agent to a precondition check and names a fallback path, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_sync_course_metadataSync Course MetadataA
[네트워크] 시험 시간표 매칭용 강의 메타데이터를 동기화합니다. LearningX SIS(개설강좌 정보)에서 개설대학/학과/교수/과목코드/분반 확정값을 받아 저장하고(source=learningx_sis), SIS 조회 실패 시 Canvas 기본 정보만 보존합니다(source=canvas_only, sis_error 포함).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | 기존 캐시가 있어도 다시 조회 (기본값: false) | |
| course_id | No | 특정 강의만 동기화 (생략하면 현재 수강 강의 전체) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| errors | No | |
| synced | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as a non-read-only, non-idempotent write, and the description adds real value beyond them: it discloses the exact source values written (source=learningx_sis), the SIS-failure fallback (source=canvas_only) and that an sis_error is included. That fallback/overwrite behavior is not derivable from the annotations or schema.
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 dense sentences with the network tag and purpose front-loaded, followed by the primary path and the failure path. It is efficiently structured, though the bracketed [네트워크] tag and multiple slash-delimited field lists make it slightly cramped.
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 the description fully covers the sync semantics, source tagging, and error fallback. It could still mention permission/auth or cache-write implications, but for this tool it is largely complete.
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% and both parameters (force, course_id) are documented in the schema itself. The description adds no syntax or format detail beyond what the schema provides, so the baseline of 3 applies.
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 names a specific verb (동기화합니다 / sync-save) and resource (강의 메타데이터 / course metadata), and specifies the upstream source (LearningX SIS). It also scopes its purpose to exam-schedule matching, which distinguishes it somewhat from generic course tools, though it never names a sibling tool explicitly.
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 phrase '시험 시간표 매칭용' (for exam schedule matching) implies the context in which to reach for this tool, but there is no explicit when-to-use/when-not guidance and no mention of the obvious alternative eclass_sync_exam_schedules or eclass_get_courses. Usage is only inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eclass_sync_exam_schedulesSync Exam SchedulesA
[네트워크] 지정한 학기의 중간/기말시험 공지를 탐색하고 PDF 시간표를 다운로드/정규화해 별도 시험 DB에 저장합니다. pdftotext가 없으면 문서만 저장하고 파싱 실패를 partial_failures에 남깁니다.
| Name | Required | Description | Default |
|---|---|---|---|
| term | Yes | 학기 식별자: YYYY-1(1학기), YYYY-2(2학기), YYYY-S(하계), YYYY-W(동계). 연도가 포함된 한글 학기명도 지원 | |
| force | No | 문서 해시가 같아도 재파싱 (기본값: false) | |
| course_id | No | 특정 강의에 관련된 소스 우선 동기화 | |
| exam_type | No | 시험 종류: midterm(중간), final(기말). 기본값: final | final |
| source_url | No | 특정 공지 URL만 동기화 |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| term | No | |
| documents | No | |
| exam_type | No | |
| sources_checked | No | |
| partial_failures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnly=false, idempotent=false, destructive=false), and the description adds genuinely useful behavior beyond them: it writes to a separate exam DB and, critically, discloses graceful degradation ('pdftotext가 없으면 문서만 저장하고 파싱 실패를 partial_failures에 남깁니다'). It omits auth requirements and rate/network failure handling, so not a 5.
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 dense sentences with no filler; the core action is front-loaded and the fallback behavior is appended. It is compact and appropriately sized, though the bracketed [네트워크] prefix is minor overhead.
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 5-param network sync with full schema coverage and an output schema, the description covers the essential action and the notable fallback path (partial_failures), so return values need not be spelled out. What is missing is when this should run relative to the get_exam_schedule sibling and any permission prerequisites.
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 schema already documents term formats, force, exam_type enum, course_id and source_url. The description references the term and midterm/final concept but adds no syntax or precedence detail beyond the schema, so baseline 3 applies.
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 names a precise verb chain (탐색 → 다운로드/정규화 → 별도 시험 DB에 저장) and a concrete resource (중간/기말시험 공지 PDF 시간표). It is clearly distinguishable from the sibling eclass_get_exam_schedule (read/retrieve) because it explicitly describes syncing and persisting to a separate DB.
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 implied by the scope ('지정한 학기의 시험 공지'), which suggests running before retrieval, but it never names when to use it versus eclass_get_exam_schedule or eclass_list_exam_sources, and states no prerequisites or exclusions. The [네트워크] tag hints at network requirements but is not framed as a gating condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchFetch eclass documentARead-onlyIdempotent
[표준] search 결과의 id를 받아 원문/상세 텍스트를 반환합니다. ChatGPT/connector 호환용 read-only fetch 도구입니다. 다운로드 항목(eclass://download/)은 파일 본문을 반환하지 않습니다. HTTP transport에서는 공개 설정된 /files/ URL만 반환하며, ChatGPT가 파일을 읽으려면 MCP tool이 아니라 브라우징으로 그 URL을 직접 열어야 합니다. 공개 URL이 아닌 localhost URL이면 MCP 서버 운영자가 ECLASS_HANDOFF_BASE_URL을 공개 HTTPS 주소로 설정해 URL을 다시 발급해야 합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | search 결과의 id |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| text | Yes | |
| title | Yes | |
| metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint/idempotentHint/destructiveHint already cover the safety profile), the description discloses real operational behavior: download entries return no body, HTTP transport only returns publicly configured /files/<token> URLs, ChatGPT must open those URLs via browsing, and localhost URLs require the operator to set ECLASS_HANDOFF_BASE_URL. This is substantial context an agent cannot get from the schema or annotations.
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?
Roughly four dense sentences, front-loaded with the core behavior before the edge cases. Every sentence carries operational information about URL handling, so there is little waste, though it is on the longer side.
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 one-parameter read-only tool that already has an output schema (so return values need not be described), the description covers the important gaps: what kind of input id is expected, what it will not return, and the transport-dependent URL behavior. Nothing an agent needs to call it correctly is missing.
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?
There is a single parameter with 100% schema description coverage, and the schema text ('search 결과의 id') is identical to what the description provides, so no additional meaning is added. The baseline of 3 applies when the schema already documents the parameter.
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 a specific verb and resource: it takes an id from search results and returns the original/detailed document text, and it explicitly labels itself a read-only fetch tool. It differentiates itself from download-oriented siblings by stating that eclass://download/<file_id> items return no file body, though it does not name a specific alternative tool.
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 establishes the usage context (invoke with the id produced by search) and gives a clear exclusion: download items do not yield file content, and file reading must be done by browsing the URL rather than through an MCP tool. It stops short of naming a specific sibling tool to use instead in those cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch eclassARead-onlyIdempotent
[표준] eclass 강의, 과제, 공지, 자료, 강의계획서, MCP 서버 로컬 다운로드 기록을 통합 검색합니다. ChatGPT/connector 호환용 read-only search 도구입니다. 다운로드 기록은 파일 본문이 아니라 서버 측 file_id/local_path 메타데이터입니다. ChatGPT가 파일 내용을 보려면 fetch 또는 eclass_file_handoff로 공개 /files/ URL을 받은 뒤 그 URL을 브라우징으로 직접 열어야 합니다. 공지/자료 본문 스캔은 비용 제어를 위해 검색어가 강의명과 일치하는 일부 강의로 제한됩니다.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 검색어 |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/non-open-world, but the description adds real behavioral nuance beyond them: download hits are metadata (file_id/local_path) not content, and notice/material body scanning is deliberately restricted to courses whose names match the query for cost control. That hidden scoping limitation is exactly the kind of trait an agent cannot infer from annotations.
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?
Five sentences, each carrying distinct information (scope, safety posture, metadata caveat, file-access workflow, cost-control limitation), with the purpose front-loaded. Slightly longer than strictly needed but no sentence is 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?
An output schema exists so return values need not be described, and the description covers scope, the metadata-vs-content distinction, the file retrieval path, and a non-obvious coverage limitation. Only the absence of sibling-tool routing keeps it from being fully complete.
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?
With one parameter at 100% schema coverage, the schema already documents 'query' as 검색어, so the baseline is 3. The description adds no syntax, matching rules, or format guidance for the query string that would go beyond 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 states a specific verb (통합 검색) and enumerates the exact resources covered (강의, 과제, 공지, 자료, 강의계획서, 다운로드 기록), so the agent knows the scope without opening a schema. It does not explicitly distinguish itself from sibling search tools like eclass_search_downloads or eclass_search_syllabus, which slightly caps the score.
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 identifies itself as a read-only connector-compatible tool and routes the agent to fetch or eclass_file_handoff when the actual file body is needed, which is useful context. However it never says when to prefer this unified search over the narrower sibling search tools, leaving the primary selection decision to inference.
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.
26 tool updates
v0.1.0- First observed
eclass_doctor - First observed
eclass_download_file - First observed
eclass_download_materials_batch - First observed
eclass_download_video - First observed
eclass_export_course_snapshot - First observed
eclass_file_handoff - First observed
eclass_get_announcements - First observed
eclass_get_assignment_detail - First observed
eclass_get_assignments - First observed
eclass_get_courses - First observed
eclass_get_courses_cached - First observed
eclass_get_download_status - First observed
eclass_get_exam_schedule - First observed
eclass_get_grades - First observed
eclass_get_materials - First observed
eclass_get_syllabus - First observed
eclass_list_downloads - First observed
eclass_list_exam_sources - First observed
eclass_remove_download - First observed
eclass_search_downloads - First observed
eclass_search_syllabus - First observed
eclass_submit_assignment - First observed
eclass_sync_course_metadata - First observed
eclass_sync_exam_schedules - First observed
fetch - First observed
search
TDQS
Scored across 26 tools
Several tools overlap in purpose: search/fetch duplicate aspects of specific eclass_* retrieval tools, export_course_snapshot overlaps with individual get_* calls, and download query tools split across status/list/search. Descriptions help clarify boundaries, but an agent must read carefully to avoid misselection.
Most tools use a consistent eclass_ prefix with snake_case verb_noun naming, such as eclass_get_courses and eclass_submit_assignment. The only deviations are the generic standard tools search and fetch, which are readable and intentionally different.
With 26 tools, the server is heavy for an LMS client surface and exceeds the typical 3-15 well-scoped range. Several adjacent tools, especially download/query and retrieval variants, could likely be consolidated.
Coverage is strong across courses, assignments, grades, announcements, materials, downloads, videos, syllabus, exam schedules, submission, export, and handoff. Minor gaps remain for richer interactive LMS features, but core student workflows are well represented.
Maintenance
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
- LovableOAuthdev.lovable
Official MCP server for Lovable, the AI-powered full-stack app builder.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Related MCP Servers
- FlicenseAqualityBmaintenanceA local MCP server that lets Claude Code operate the PolyU eStudent portal to check grades, timetable, exams, search subjects, and manage course registration through natural language.9-
- AlicenseBqualityAmaintenanceUnofficial CLI to access UPC Aula Virtual (Blackboard) from the terminal, with an MCP server for Claude to manage courses, assignments, and downloads.56246 npm10ISC
- AlicenseNot gradedqualityDmaintenanceEnables Claude to access Chung-Ang University's e-class platform, including dashboard, daily briefing, course details, VOD links, and smart file download.1MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that provides tools to interact with SNU eTL (Canvas LMS), including viewing courses, assignments, announcements, grades, downloading and organizing course files, with persistent local storage and automatic sync.MIT