plato-mcp
PNU 비공식(unofficial) 개발 진행 중 AGPL-3.0 License Python 3.11+

부산대 PLATO를 위한
MCP 서버

Claude 같은 AI 어시스턴트가 여러분을 대신해 PLATO(Moodle 기반 LMS)에 로그인하지 않고도, 여러분이 이미 접근 권한을 가진 강좌 자료·공지·과제·성적·Q&A를 조회·작성·다운로드할 수 있게 해주는 MCP 서버입니다.

01 제공하는 도구

공식 Moodle webservice API로 동작하는 도구와, ubboard(공지/Q&A) 게시판을 본인 로그인 세션으로 스크레이핑하는 도구로 나뉩니다. ✏️ 쓰기 도구는 실행 전 dry_run 미리보기 확인을 거쳐야만 실제로 전송됩니다.

강좌 · 과제 · 성적 · 일정 · 쪽지 (공식 API)

list_courses
수강 중인 강좌 목록
get_course_contents
강좌 콘텐츠(주차별 자료 등)
list_assignments
과제 목록
get_assignment_detail
과제 상세 및 제출 상태
submit_assignment write
과제 제출 (텍스트)
get_grades
성적 조회
list_calendar_events
캘린더 일정
get_unread_messages
안 읽은 쪽지/알림

공지사항 · Q&A (ubboard, 세션 스크레이핑)

list_notices
공지사항 목록
get_notice_detail
공지사항 상세
list_qna
Q&A 게시글 목록
get_qna_detail
Q&A 게시글 상세
post_qna_question write
Q&A 질문 등록

파일

download_course_file
강좌 첨부파일 다운로드 (원격 실행 시 링크/inline 반환)

02 설치 / 사용 방법

일반 사용자는 Smithery를 통해 설치하고, 코드를 직접 수정/실행하려는 개발자는 로컬 클론 경로를 따라가세요.

Smithery로 설치 (일반 사용자)

Claude Desktop, Claude Code, Claude.ai 커넥터 등에서 바로 추가할 수 있습니다.

  1. smithery.ai의 plato-mcp 페이지에 접속합니다.
  2. Add to toolbox 또는 Install을 눌러 원하는 클라이언트(Claude Desktop/Code/CLI 등)를 선택합니다.
  3. 설정 화면에서 PLATO 학번(pnu_id)과 비밀번호(pnu_password)를 입력합니다 — 이 값은 세션 동안만 사용되고 서버 디스크에 저장되지 않습니다.
  4. 연결 후 list_courses 같은 도구를 호출해 정상 동작하는지 확인합니다.
연결 전에 꼭 읽어주세요: 이 서버는 면책조항개인정보 안내에 설명된 대로, PLATO에서 이미 볼 수 있는 내용(다른 학생 이름이 포함된 Q&A 게시글 등)을 AI와의 대화로 그대로 전달합니다.

로컬에서 직접 실행 (기여자 · 개발자용)

코드를 수정하거나 로컬에서 직접 돌려보고 싶을 때. 실제 PLATO 계정 없이도 테스트는 가능합니다(mock 기반).

git clone https://github.com/jin-1119/plato-mcp.git
cd plato-mcp
pip install -e ".[dev]"

# 단위 테스트 (실계정 불필요)
pytest

# 린트
ruff check .

# 로컬 MCP 서버 실행 (stdio, Claude Desktop/Code 연동용)
python -m plato_mcp.server

03 기여하기

이슈 하나 = 작업 단위 하나. 모든 변경은 이슈에서 시작해서 PR로 끝납니다.

  1. 이슈부터 확인/생성. 하려는 작업이 이미 이슈로 있는지 먼저 찾아보고, 없으면 새로 만듭니다. 버그 수정이든 기능 추가든 문서 수정이든 동일합니다.
  2. Fork & 브랜치 생성. 저장소를 fork한 뒤, main에서 분기해 feature/issue-<번호>-<짧은-설명> 형식의 브랜치를 만듭니다 (버그 수정은 fix/issue-<번호>-...).
  3. 작업 + 테스트. 변경 후 pytestruff check .가 모두 통과해야 합니다. 이 저장소는 실제 PLATO 계정을 다루므로, 자격증명이 로그·에러 메시지에 노출되지 않는지 특히 신경써 주세요 (SECURITY.md 참고).
  4. PR 생성. 어떤 이슈를 해결하는지(Closes #N), 무엇을 바꿨는지, 어떻게 검증했는지를 PR 설명에 적습니다.
  5. 리뷰 & 머지. CI(lint + test)가 통과하고 리뷰가 끝나면 머지됩니다. 머지 후 브랜치는 삭제됩니다.

04 Git / 이슈 / 브랜치 관리 규칙

이 저장소가 실제로 따르는 운영 규칙입니다. PR을 보내기 전에 한 번 훑어보시면 리뷰가 빨라집니다.

Backlog아직 시작 안 한 아이디어/작업
Ready착수 가능, 의존성 해소됨
In Progress브랜치 생성 후 실제 작업 중
In ReviewPR 생성, 리뷰/CI 대기
Done머지 완료
작업 상태의 기준GitHub Project 보드Status 필드가 유일한 기준입니다. 라벨이나 코멘트가 아니라 보드 상태를 봅니다.
브랜치 네이밍feature/issue-<N>-<slug>, fix/issue-<N>-<slug>, docs/issue-<N>-<slug><type>/issue-<번호>-<설명> 형식.
기준 브랜치main에서만 분기합니다. main에는 직접 커밋하지 않고 항상 PR을 통해서만 반영됩니다.
이슈 구조큰 작업(Phase)은 부모 이슈로 묶고, 실제 작업은 하위 이슈로 쪼갭니다. 부모 이슈는 하위 이슈가 전부 닫히면 자동으로 닫힙니다 — 자세한 예시는 PLAN.md 참고.
커밋작고 원자적인 커밋을 선호합니다. 머지는 기본적으로 squash 방식을 사용합니다.
CI 게이트모든 PR은 머지 전에 pytest tests/unitruff check .를 통과해야 합니다 (GitHub Actions로 자동 실행).

05 더 읽어보기