Skip to main content
Glama
jseook11

CAU eclass MCP (중앙대 이클래스)

cau-eclass-mcp

License: MIT Node.js MCP Tests

중앙대학교 eclass를 자연어로. 시험 일정부터 과제 제출까지, LMS 작업을 Claude·Codex 같은 MCP 클라이언트의 도구로 노출하는 서버입니다.

중앙대 eclass(LearningX / Canvas LMS)를 다루는 MCP 서버입니다. 강의·과제·성적 조회, 자료/동영상 다운로드, 과제 제출, 중간·기말시험 시간표 조회, 강의계획서(syllabus) 검색·조회를 하나의 도구 세트로 제공합니다. 인증(secure backend 토큰 캐시 → 만료 시 Playwright 자동 로그인), 타임아웃·재시도, 부분 실패 처리는 서버가 알아서 흡수하므로 클라이언트는 자연어 요청만 던지면 됩니다.

WARNING

개인 학습·편의용비공식 도구입니다. 본인 계정으로 본인의 학습 데이터에만 사용하세요. 사용에 따른 책임(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.

위 대화는 동작을 보여주기 위한 예시입니다(값은 임의).

주요 기능

영역

할 수 있는 것

핵심 도구

강의

이번 학기 교과목 조회(로컬 스냅샷 우선), 이전 학기·예방교육 분리 조회

eclass_get_courses, eclass_get_courses_cached

과제

마감 임박 과제·퀴즈 조회, 상세(제출 유형/확장자/마감) 확인

eclass_get_assignments, eclass_get_assignment_detail

과제 제출

파일/텍스트 제출 (기본 dry_run, 이중 제출 방지 검증)

eclass_submit_assignment

성적

강의 단위 + 과제별 점수

eclass_get_grades

자료

강의 자료 목록 수집, MCP 서버 로컬 다운로드, 공개 URL handoff 별도 발급

eclass_get_materials, eclass_download_materials_batch, eclass_file_handoff

동영상

OCS UniPlayer MP4 동영상을 MCP 서버 로컬에 다운로드

eclass_download_video

시험 시간표

중간·기말시험 공지 PDF 파싱 → 전체 시간표 또는 course_id별 시험 일시·장소 조회

eclass_sync_exam_schedules, eclass_get_exam_schedule

강의계획서

과목명/교수명으로 검색 → OZ 리포트 PDF를 구조화(교재·평가·주차일정) 조회

eclass_search_syllabus, eclass_get_syllabus

백업

강의 스냅샷을 JSON/Markdown으로 내보내기

eclass_export_course_snapshot

진단

인증·브라우저·API 사전 점검

eclass_doctor

전체 도구 명세와 파라미터는 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 setup

pnpm 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 8787

ChatGPT에서는 Settings → Apps & Connectors → Advanced settings에서 Developer Mode를 켠 뒤, connector/app 생성 화면에 tunnel URL의 /mcp 경로를 넣습니다.

https://<subdomain>.ngrok.app/mcp

HTTP 서버는 다음을 지원합니다.

  • GET / — health check

  • POST/GET/DELETE /mcp — MCP Streamable HTTP transport

  • ECLASS_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을 직접 열어야 합니다.

사용 예시

자연어 요청

서버가 하는 일

"이번 학기 기말시험 언제 어디서 보는지 정리해줘"

시험 동기화 후 course_id별 조회

"이번 학기 중간시험 전체 시간표 보여줘"

exam_type: "midterm"으로 동기화 후 전체 조회

"2026년 여름 계절학기 기말시험 시간표 보여줘"

term: "2026-S", exam_type: "final"로 동기화 후 조회

"이번 주 마감 과제만 보여줘"

eclass_get_assignments { days_ahead: 7, include_submitted: false }

"운영체제 강의 자료 안 받은 거 다 받아줘"

eclass_get_materials → eclass_download_materials_batch로 MCP 서버 로컬 캐시에 저장

"이 과제 제출 가능한지 먼저 확인해줘"

eclass_get_assignment_detail → dry_run 제출

"운영체제 교재 보통 뭐 써?"

eclass_search_syllabus → eclass_get_syllabus

자주 쓰는 도구 조합 흐름은 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_USERNAME

(필수)

eclass 로그인 ID

ECLASS_DOWNLOAD_DIR

~/Downloads/eclass

다운로드 저장 위치

ECLASS_DB_PATH

~/.eclass-mcp/files.db

다운로드/강의 캐시 DB

ECLASS_EXAM_DB_PATH

~/.eclass-mcp/exams.db

시험 시간표 전용 DB

ECLASS_HANDOFF_MAX_BYTES

26214400

eclass_file_handoff가 URL handoff를 허용할 파일의 최대 크기(바이트). 기본 25MB

ECLASS_CREDENTIAL_BACKEND

auto

encrypted / keytar 강제, file은 legacy read-only. auto는 encrypted → keytar 순서이며 둘 다 없으면 실패

ECLASS_SECRET_KEY

(없음)

암호화 백엔드 마스터 키(32바이트 base64). 실행 시 주입

ECLASS_SECRET_KEY_FILE

(없음)

repo 밖의 권한 0600 마스터 키 파일 경로(raw 32바이트 또는 base64 텍스트)

ECLASS_ENC_STORE_PATH

~/.eclass-mcp/secrets.enc

암호화 비밀번호 파일 경로

ALLOW_PLAINTEXT_ENV_SECRETS

꺼짐

1일 때만 ECLASS_PASSWORD env 허용. 토큰·세션용 keytar/encrypted backend는 별도 필수

ECLASS_TRANSPORT

stdio

http로 지정하면 remote MCP HTTP 서버 실행

ECLASS_HTTP_PORT / PORT

8787

HTTP transport 포트

ECLASS_REMOTE_AUTH_TOKEN

(없음)

설정 시 /mcp Bearer 또는 X-Eclass-Auth 인증 강제

ECLASS_HTTP_ALLOWED_ORIGINS

Origin 요청 기본 거부

HTTP CORS origin allowlist (콤마 구분)

CONTROL_PLANE_API_KEY

(없음)

OpenAI tunnel 런타임 API 키 (Tunnels Read+Use). pnpm run chatgptui에서 사용

CONTROL_PLANE_TUNNEL_ID

(없음)

tunnel 식별자 (Platform Tunnels 발급)

ECLASS_TUNNEL_PROFILE_FILE

${XDG_CONFIG_HOME:-~/.config}/tunnel-client/eclass-mcp.yaml

tunnel-client 프로파일 경로 오버라이드

DEBUG

꺼짐

1이면 stderr 디버그 로그

트러블슈팅

증상

원인 / 해결

MCP 연결 시 -32000 오류

pnpm start로 띄우면 stdout 배너가 JSON-RPC를 오염시킵니다. node dist/index.js로 직접 실행하세요(셋업이 생성하는 설정도 이 형태).

도구가 안 보임 / 실행 안 됨

pnpm run build로 dist/를 먼저 빌드했는지, 클라이언트를 재시작했는지 확인하세요.

시험·강의계획서 PDF 파싱이 비어 있음

pdftotext(poppler)가 없을 때입니다. macOS는 brew install poppler. 다른 기능은 정상 동작합니다.

첫 실행 시 키체인 접근 권한 요청

OS 자격증명 저장소 접근 권한을 허용해야 토큰을 캐시할 수 있습니다.

헤드리스 서버에서 비밀번호를 못 찾음(Password not found ... backend=...)

Keychain/D-Bus가 없는 환경입니다. pnpm run setup -- --target encrypted --generate-master-key-file <path>로 암호화 저장소와 키 파일을 만들고, 실행 시 ECLASS_CREDENTIAL_BACKEND=encrypted와 ECLASS_SECRET_KEY_FILE=<path>를 주입하세요. 오류 메시지가 활성 백엔드와 다음 조치를 알려줍니다. 암호화 백엔드 참고.

로그인·인증이 계속 실패

pnpm run doctor로 인증·브라우저·API·자격증명 백엔드 상태를 점검하세요.

개발

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 연결, 자료 반환, 제출 결과를 확인합니다.

  • 과거 디버깅 방식의 흔적, 폐기된 필드의 부재, 개발 문서의 특정 키워드만 검사하는 테스트는 만들지 않습니다.

  • 비밀값 누출, 중복 제출, 잘못된 자료 반환, 기존 데이터 손실을 막는 검사는 유지합니다. 호출 횟수·순서는 실제 부작용을 막는 데 필요한 경우에만 고정합니다.

문서

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 tools
eclass_doctorDoctorA
Read-onlyIdempotent

[로컬] 진단 도구. Playwright Chromium 실행 가능 여부를 빠르게 확인합니다. 다른 도구가 인증/브라우저 오류로 실패할 때 원인 파악용으로 사용하세요.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksYes
checked_atNo

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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를 사용하세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes다운로드 URL (courseresource 파일은 null 허용 — Playwright로 다운로드)
typeNo자료 유형. ExternalTool은 LTI 런치 후 실제 파일을 찾습니다. mp4/video/m3u8 계열은 파일 도구에서 거부되며 eclass_download_video 대상입니다.
sourceNo
file_idYesCanvas 파일 ID
course_idYes강의 ID
unlock_atNo
asset_kindNo
module_nameNo
display_nameYes저장할 파일명
downloadableNo
external_urlNo
locked_for_userNo
resolution_reasonNo
acquisition_policyNo
is_playright_requiredNois_playwright_required의 이전 오탈자 별칭. 둘 중 하나면 런치 경로를 탑니다.
is_playwright_requiredNotrue면 eclass3 래퍼 URL이어도 ExternalTool LTI 런치로 처리합니다.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
statusNo
file_idYes
messageNo
skippedNo
strategyNo
retryableNo
error_codeNo
local_pathNo
size_bytesNo
next_actionNo
display_nameYes
failure_kindNo
handoff_noteNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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로 별도 처리합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes강의 ID
materialsYes다운로드할 자료 목록
continue_on_errorNo실패해도 계속 진행 (기본값: true). false면 첫 실패에서 중단

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultsNo
summaryNo
course_idNo
handoff_noteNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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에 이 형식을 사용하세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYeshttps://ocs.cau.ac.kr/em/<content_id> 형식의 OCS 뷰어 URL
typeNo자료 유형 (참고용)
sourceNo자료 출처 (캐시에 기록됨)
video_idYes동영상 ID 또는 material id (캐시 키로 사용)
course_idYes강의 ID
display_nameYes저장할 파일명 (.mp4 없으면 자동 추가)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
messageNo
skippedNo
strategyNo
video_idNo
retryableNo
error_codeNo
local_pathNo
size_bytesNo
display_nameNo
handoff_noteNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SnapshotA
Destructive

[네트워크] 한 강의의 현재 상태(강의 정보, 과제, 공지, 자료, 다운로드 현황, 선택적 성적)를 한 번에 JSON 또는 Markdown으로 내보냅니다. 강의 전반을 훑을 때는 개별 조회 여러 번 대신 이 도구 1회를 사용하세요. output_path 지정 시 파일로 저장(기존 파일은 overwrite=true 없이는 거부).

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNo출력 형식 (기본값: json)json
course_idYes강의 ID
overwriteNooutput_path에 기존 파일이 있을 때 덮어쓸지 여부 (기본값: false — 거부)
output_pathNo저장 경로 (생략하면 결과에 직접 반환)
include_gradesNo성적 포함 여부 (기본값: false)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
formatNo
contentNo
snapshotNo
course_idNo
local_pathNo
partial_failuresNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 HandoffA
Read-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로 조정).

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesURL을 발급할 로컬 다운로드 파일의 file_id (eclass_search_downloads 결과). 영상은 "video:<id>" 형식.

Output Schema

ParametersJSON Schema
NameRequiredDescription
file_idYes
deliveredYes
mime_typeNo
size_bytesNo
display_nameNo
download_urlNo

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 AnnouncementsB
Read-onlyIdempotent

[네트워크] 강의 공지사항을 가져옵니다

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo가져올 공지사항 수 (기본값: 20)
course_idYes강의 ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 DetailA
Read-onlyIdempotent

[네트워크] 단일 과제의 상세 정보를 가져옵니다 (제출 유형, 마감/잠금 일시, 배점, 허용 확장자, 제출 여부/일시, 시도 횟수, 점수). 과제 제출 전 확인용.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes강의 ID
assignment_idYes과제 ID (eclass_get_assignments의 url에서 확인하거나 과제 목록 참고)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
messageNo
retryableNo
assignmentNo
error_codeNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 AssignmentsA
Read-onlyIdempotent

[네트워크] 과제 및 퀴즈 목록을 가져옵니다. course_id 지정 시 submission_types가 포함되며(external_tool=LTI 과제는 API 제출 불가), days_ahead 상한 없이 해당 강의의 미래 마감 과제가 전부 반환됩니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo강의 ID (생략하면 전체 강의)
days_aheadNo몇 일 이내 마감 과제를 가져올지 (기본값: 30)
include_submittedNo제출한 과제 포함 여부 (기본값: true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 CoursesA
Read-onlyIdempotent

[네트워크] e-Class 강의 목록을 새로 가져옵니다. 기본 current는 term 이름/ID·날짜로 판별한 이번 학기 일반 교과목만 반환하고 현재 강의 캐시를 교체합니다. all은 Canvas의 available/completed active 수강 이력(이전 학기·교육 포함), training은 보수적으로 분류한 예방/의무교육만 반환합니다. 현재 학기를 판별할 수 없으면 전체를 현재라고 오인하지 않고 실패하므로 scope=all로 원본 범위를 확인하세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNocurrent(기본): 이번 학기 교과목, all: available/completed active 수강 이력, training: 예방/의무교육current

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 CachedA
Read-onlyIdempotent

[로컬] 캐시의 현재 학기 강의 스냅샷을 조회합니다. 네트워크 호출 없이 course_id ↔ 강의명 매핑에 사용합니다. course_id를 지정한 exact lookup은 이전 학기 catalog도 찾습니다. 캐시가 비어 있거나 학기가 바뀐 경우 eclass_get_courses의 기본 current 조회로 갱신하세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo특정 강의 ID만 조회

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StatusA
Read-onlyIdempotent

[로컬] MCP 서버 로컬 캐시의 다운로드 현황을 강의별로 요약 조회합니다. 이 도구는 파일 본문을 반환하지 않습니다. 파일 내용을 보려면 eclass_search_downloads/eclass_list_downloads로 file_id를 찾고 eclass_file_handoff로 공개 URL을 별도 발급해야 합니다. 강의명은 로컬 course cache를 사용합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo특정 강의 ID 상세 조회

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
coursesNo
downloadsNo
handoff_noteNo
total_file_countNo
total_size_bytesNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ScheduleA
Read-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을 함께 주면 먼저 네트워크 동기화 후 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
termNo학기 필터: YYYY-1, YYYY-2, YYYY-S(하계), YYYY-W(동계). 연도가 포함된 한글 학기명도 지원
queryNo강의명/교수명/과목코드 검색어
refreshNo조회 전 시험 공지 동기화 수행. true면 term 필요
course_idNo강의 ID로 조회
exam_typeNo시험 종류: midterm(중간), final(기말). 기본값: finalfinal

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
modeNo
reasonNo
matchesNo
candidatesNo
matched_byNo
refresh_resultNo
course_metadataNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 GradesA
Read-onlyIdempotent

[네트워크] 성적을 가져옵니다. 강의 단위 점수(current/final)와 과제별 점수/제출여부/채점일시를 포함합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo특정 강의만 조회 (생략하면 전체 강의)
include_assignmentsNo과제별 점수 포함 여부 (기본값: true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorsNo
coursesNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 MaterialsA
Read-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 실패 시 성공한 자료와 실패 정보를 함께 반환합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourcesNo가져올 소스. 생략 시 modulebuilder, courseresource, announcements, modules, external을 조회한다. files는 Files 탭이 보이거나 명시적 요청이 있을 때 마지막으로 별도 조회한다.
course_idYes강의 ID
resolve_externalNo미확인 ExternalTool을 LTI로 확인합니다. 파일을 저장하지 않으며 동일 메타데이터의 비재시도 결과는 SQLite에 보존합니다.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorsNo
sourcesNo
warningsNo
course_idNo
materialsNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SyllabusA
Read-onlyIdempotent

[mportal] 특정 강의의 강의계획서 본문을 구조화해 반환합니다(교재·평가비율·주차일정·교수정보 등). 입력 키는 eclass_search_syllabus 결과 행을 그대로 넘기세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
sustNo
termYes
yearYes
campcdNo
clssno1Yes분반
sbjtno1Yes학수번호

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
messageNo
documentNo
retryableNo
error_codeNo

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DownloadsA
Read-onlyIdempotent

[로컬] MCP 서버 로컬 캐시에 저장된 다운로드 기록 전체를 나열합니다. 이 도구는 파일 본문을 반환하지 않습니다. ChatGPT가 파일을 읽어야 하면 file_id로 eclass_file_handoff를 호출해 공개 /files/ URL을 별도 발급해야 합니다. 조건 검색은 eclass_search_downloads, 강의별 요약은 eclass_get_download_status를 사용하세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo강의 ID (생략하면 전체)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SourcesA
Read-onlyIdempotent

[로컬/네트워크] 시험 공지 소스 목록을 조회합니다. refresh=true면 중앙대 대학 목록에서 단과대 후보를 갱신합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNo공지 소스 후보를 다시 탐색 (기본값: false)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
sourcesNo
partial_failuresNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 DownloadA
Destructive

[로컬] 다운로드 기록(DB 레코드)만 삭제합니다 — 디스크의 파일은 남습니다. 삭제 후 재다운로드가 가능합니다. 영상 기록의 file_id는 "video:" 형식입니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idNo특정 파일 ID 삭제
course_idNo강의의 모든 기록 삭제

Output Schema

ParametersJSON Schema
NameRequiredDescription
file_idNo
removedYes
course_idNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 DownloadsA
Read-onlyIdempotent

[로컬] MCP 서버 로컬 캐시에 다운로드된 파일 기록만 필터 검색합니다 (파일명/강의명/확장자/source/다운로드 날짜 범위). 이 도구는 파일 본문을 반환하지 않습니다. ChatGPT가 파일을 보려면 검색된 file_id로 eclass_file_handoff를 호출해 공개 /files/ URL을 발급하고, 그 URL을 브라우징으로 직접 열어야 합니다. 전체 나열은 eclass_list_downloads, 강의별 요약은 eclass_get_download_status를 사용하세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo최대 결과 수 (기본값: 50)
queryNo파일명 또는 강의명에 대한 부분 일치 (대소문자 무시)
sourceNo자료 출처 필터 (modules/files/courseresource 등). source가 기록된 항목만 매칭됨
course_idNo강의 ID 필터
extensionNo확장자 필터 (예: "pdf" 또는 ".pdf")
downloaded_afterNo이 일시 이후 다운로드 (ISO, 포함)
downloaded_beforeNo이 일시 이전 다운로드 (ISO, 포함)

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitNo
matchesYes
handoff_noteNo
total_matchedNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SyllabusA
Read-onlyIdempotent

[mportal] 강의계획서를 검색합니다. year/term 미지정 시 현재 학기. 후보 목록(학수번호·분반·강의명·교수·단과대·강의시간)을 반환하니 호출자가 판단해 eclass_get_syllabus로 상세를 받으세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
byNosubject
termNo학기 코드(1/2/S/W). 미지정 시 현재 학기
yearNo개설년도(예: 2026). 미지정 시 현재 학기
queryYes검색어(과목명 또는 교수명)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
itemsNo
messageNo
retryableNo
error_codeNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AssignmentA
Destructive

[네트워크] 과제를 제출합니다. 기본 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 폴백은 단일 파일만 지원합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo본문 제출 내용 (online_text_entry)
commentNo제출 코멘트
dry_runNotrue면 실제 제출하지 않고 검증만 수행 (기본값: true)
course_idYes강의 ID
file_pathsNo업로드할 로컬 파일 경로 목록 (online_upload)
assignment_idYes과제 ID
confirm_resubmitNo이미 제출된 과제 재제출 확인 플래그

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
modeNo
attemptNo
messageNo
strategyNo
retryableNo
error_codeNo
validationNo
submitted_atNo
verificationNo
is_resubmissionNo
already_submittedNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 포함).

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo기존 캐시가 있어도 다시 조회 (기본값: false)
course_idNo특정 강의만 동기화 (생략하면 현재 수강 강의 전체)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorsNo
syncedNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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에 남깁니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
termYes학기 식별자: YYYY-1(1학기), YYYY-2(2학기), YYYY-S(하계), YYYY-W(동계). 연도가 포함된 한글 학기명도 지원
forceNo문서 해시가 같아도 재파싱 (기본값: false)
course_idNo특정 강의에 관련된 소스 우선 동기화
exam_typeNo시험 종류: midterm(중간), final(기말). 기본값: finalfinal
source_urlNo특정 공지 URL만 동기화

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
termNo
documentsNo
exam_typeNo
sources_checkedNo
partial_failuresNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 documentA
Read-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을 다시 발급해야 합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYessearch 결과의 id

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlYes
textYes
titleYes
metadataNo

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 26 tool updatesv0.1.0
    • First observedeclass_doctor
    • First observedeclass_download_file
    • First observedeclass_download_materials_batch
    • First observedeclass_download_video
    • First observedeclass_export_course_snapshot
    • First observedeclass_file_handoff
    • First observedeclass_get_announcements
    • First observedeclass_get_assignment_detail
    • First observedeclass_get_assignments
    • First observedeclass_get_courses
    • First observedeclass_get_courses_cached
    • First observedeclass_get_download_status
    • First observedeclass_get_exam_schedule
    • First observedeclass_get_grades
    • First observedeclass_get_materials
    • First observedeclass_get_syllabus
    • First observedeclass_list_downloads
    • First observedeclass_list_exam_sources
    • First observedeclass_remove_download
    • First observedeclass_search_downloads
    • First observedeclass_search_syllabus
    • First observedeclass_submit_assignment
    • First observedeclass_sync_course_metadata
    • First observedeclass_sync_exam_schedules
    • First observedfetch
    • First observedsearch

TDQS

A3.6/5.0

Scored across 26 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers