Back to Browse

Plato MCP Server

Developer ToolsScan in ProgressMCP RegistryRemote
Free

Server data from the Official MCP Registry

PLATO (Pusan National University LMS) MCP server via Moodle Web Service API + ubboard scraping

About

PLATO (Pusan National University LMS) MCP server via Moodle Web Service API + ubboard scraping

Remote endpoints: streamable-http: https://plato-mcp.onrender.com/mcp

Security Report

0.0
Use Caution0.0Moderate Risk

67 tools verified ยท Open access ยท No issues found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Remote servers are capped at 8.0 because source code is not available for review. The score reflects endpoint verification only.

How to Connect

Remote Plugin

No local installation needed. Your AI client connects to the remote endpoint directly.

Add this to your MCP configuration to connect:

{
  "mcpServers": {
    "io-github-jin-1119-plato-mcp": {
      "url": "https://plato-mcp.onrender.com/mcp"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

plato-mcp

๐Ÿ”— ์„ค์น˜ ๊ฐ€์ด๋“œ ํŽ˜์ด์ง€ โ€” ํ•™๋ฒˆ/๋น„๋ฐ€๋ฒˆํ˜ธ๋งŒ ์ž…๋ ฅํ•˜๋ฉด Claude.ai, Claude Code, Codex CLI์šฉ ์—ฐ๊ฒฐ ๋ช…๋ น์–ด๋ฅผ ๋ฐ”๋กœ ๋งŒ๋“ค์–ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

License: AGPL v3 Python 3.11+ Status: WIP Unofficial

๋ถ€์‚ฐ๋Œ€ํ•™๊ต(PNU)์˜ ๋ฌด๋“ค(Moodle) ๊ธฐ๋ฐ˜ LMS์ธ PLATO(https://plato.pusan.ac.kr/)๋ฅผ ์œ„ํ•œ ๋น„๊ณต์‹ MCP(Model Context Protocol) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. Claude ๊ฐ™์€ AI ์–ด์‹œ์Šคํ„ดํŠธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์„ ๋Œ€์‹ ํ•ด PLATO์— ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š๊ณ ๋„, ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฏธ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๊ฐ•์ขŒ ์ž๋ฃŒยท๊ณต์ง€ยท๊ณผ์ œยท์„ฑ์ ยทQ&A๋ฅผ ์กฐํšŒยท์ž‘์„ฑยท๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค.

์•„์ง ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๊ตฌํ˜„ ๊ณ„ํš์€ PLAN.md๋ฅผ, ํ˜„์žฌ ์ง„ํ–‰ ์ƒํ™ฉ์€ GitHub Issues / Project ๋ณด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ด ์„œ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ PLATO ํ•™๋ฒˆยท๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ธ์ฆํ•˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๋กœ ์ง์ ‘ ์—ด๋žŒํ•  ๋•Œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ๋‹ค๋งŒ ๊ทธ ๋‚ด์šฉ์ด AI์™€์˜ ๋Œ€ํ™”๋กœ ํ˜๋Ÿฌ ๋“ค์–ด๊ฐ„๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์•„๋ž˜ ๋ฉด์ฑ…์กฐํ•ญ๊ณผ ๊ฐœ์ธ์ •๋ณด ์•ˆ๋‚ด๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฝ์–ด ์ฃผ์„ธ์š”.


์‹œ์ž‘ํ•˜๊ธฐ

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋‘ ๋ถ€๋ฅ˜์˜ ๋…์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค โ€” ๊ทธ๋ƒฅ ์จ๋ณด๊ณ  ์‹ถ์€ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์™€ ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๊ฑฐ๋‚˜ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž. ์•„๋ž˜์—์„œ ๋ณธ์ธ์—๊ฒŒ ๋งž๋Š” ์ชฝ์„ ๊ณ ๋ฅด์„ธ์š”.

์ผ๋ฐ˜ ์‚ฌ์šฉ์ž โ€” ๊ทธ๋ƒฅ ์จ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด

์ฝ”๋“œ๋ฅผ ๋‚ด๋ ค๋ฐ›๊ฑฐ๋‚˜ ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„๋Š” ๊ณต์‹ MCP Registry์— io.github.jin-1119/plato-mcp๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ๊ณ , ์‹ค์ œ ์ฃผ์†Œ๋Š” https://plato-mcp.onrender.com/mcp(Streamable HTTP)์ž…๋‹ˆ๋‹ค.

Smithery ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค๋Š” ๋” ์ด์ƒ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” Smithery๊ฐ€ ์‹ ๊ทœ ์™ธ๋ถ€ ์„œ๋ฒ„ ๋“ฑ๋ก์„ ๋ง‰๊ณ  2026-10-31์— ์ „์ฒด ์„œ๋น„์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด์„œ, ๊ณต์‹ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋ฐฐ๊ฒฝ์€ docs/smithery_deployment_model.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  1. ์‚ฌ์šฉ ์ค‘์ธ MCP ํด๋ผ์ด์–ธํŠธ์—์„œ ์•„๋ž˜ ์ฃผ์†Œ๋ฅผ ์›๊ฒฉ(remote) MCP ์„œ๋ฒ„๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:
    • Claude.ai / Claude Desktop: ์„ค์ • โ†’ Connectors โ†’ Add custom connector โ†’ URL์— https://plato-mcp.onrender.com/mcp ์ž…๋ ฅ.
    • Claude Code: claude mcp add --transport http plato-mcp https://plato-mcp.onrender.com/mcp
    • MCP Registry๋ฅผ ์ง์ ‘ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ๋ผ๋ฉด io.github.jin-1119/plato-mcp๋กœ ์ฐพ์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  2. ์—ฐ๊ฒฐ ์‹œ PLATO ํ•™๋ฒˆ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ (ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ) ์ปค๋„ฅํ„ฐ ์„ค์ • ๊ฐ’์œผ๋กœ, ์•„๋‹ˆ๋ฉด ํ—ค๋”/์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ(pnu_id, pnu_password)๋กœ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์„œ๋ฒ„ ๋””์Šคํฌ์— ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค โ€” ์ž์„ธํ•œ ๋‚ด์šฉ์€ SECURITY.md๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  3. ์—ฐ๊ฒฐ๋˜๋ฉด AI ์–ด์‹œ์Šคํ„ดํŠธ์—๊ฒŒ ์ž์—ฐ์–ด๋กœ ์š”์ฒญํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ:
    • "์ด๋ฒˆ ์ฃผ์— ์ œ์ถœํ•ด์•ผ ํ•  ๊ณผ์ œ๊ฐ€ ๋ญ๊ฐ€ ์žˆ์–ด?"
    • "์ด๋ฒˆ ํ•™๊ธฐ ์„ฑ์  ์•Œ๋ ค์ค˜"
    • "OO ๊ณผ๋ชฉ 3์ฃผ์ฐจ ๊ฐ•์˜์ž๋ฃŒ ๋‹ค์šด๋กœ๋“œํ•ด์ค˜"
    • "OO ๊ณผ๋ชฉ ๊ณต์ง€์‚ฌํ•ญ ์ตœ๊ทผ ๊ฒƒ๋ถ€ํ„ฐ ๋ณด์—ฌ์ค˜"

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ๋ฉด์ฑ…์กฐํ•ญ๊ณผ ๊ฐœ์ธ์ •๋ณด ์•ˆ๋‚ด๋ฅผ ์ฝ์–ด ์ฃผ์„ธ์š”. ํŠนํžˆ ๊ณผ์ œ ์ œ์ถœยทQ&A ๋“ฑ๋ก์ฒ˜๋Ÿผ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋Š” ๋™์ž‘(โœ๏ธ ํ‘œ์‹œ)์€ ์‹คํ–‰ ์ „ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ™•์ธ์„ ๊ฑฐ์น˜๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ๋ฐฐํฌํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด docs/smithery_publish_guide.md์˜ ๋น„์ „๊ณต์ž์šฉ ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ฐœ๋ฐœ์ž โ€” ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๊ฑฐ๋‚˜ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

๋ฒ„๊ทธ ์ˆ˜์ •, ์ƒˆ ๋„๊ตฌ ์ถ”๊ฐ€, ๋ฌธ์„œ ๊ฐœ์„  ๋“ฑ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์Šˆ/๋ธŒ๋žœ์น˜/PR์„ ์ด ์ €์žฅ์†Œ๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์šด์˜ํ•˜๋Š”์ง€๋Š” CONTRIBUTING.md์— ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค โ€” PR์„ ๋ณด๋‚ด๊ธฐ ์ „์— ๋จผ์ € ์ฝ์–ด ์ฃผ์„ธ์š”. ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •์€ ๋ฐ”๋กœ ์•„๋ž˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.


์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ (MCP Tools)

๊ณต์‹ Moodle webservice API๋กœ ๋™์ž‘ํ•˜๋Š” ๋„๊ตฌ์™€, ubboard(๊ณต์ง€/Q&A) HTML์„ ๋ณธ์ธ ์„ธ์…˜์œผ๋กœ ์Šคํฌ๋ ˆ์ดํ•‘ํ•˜๋Š” ๋„๊ตฌ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ๋„๊ตฌ(โœ๏ธ)๋Š” ์‹คํ–‰ ์ „ ํ™•์ธ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค (์ž์„ธํ•œ ๋‚ด์šฉ์€ docs/write_confirmation_pattern.md). PLATO๊ฐ€ ์‹ค์ œ๋กœ ์ œ๊ณตํ•˜๋Š” 439๊ฐœ Moodle API ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ์ด MCP๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ค˜๋Š”์ง€(๊ตฌํ˜„/์ค‘๋ณต/ ๋น„ํ™œ์„ฑํ™”/๊ถŒํ•œ์—†์Œ/๋ฏธ๊ตฌํ˜„ ์‚ฌ์œ )๋Š” docs/moodle_api_coverage.md ์ฐธ๊ณ .

๊ฐ•์ขŒ / ๊ณผ์ œ / ์„ฑ์  / ์ผ์ • / ์ชฝ์ง€ โ€” ๊ณต์‹ API

  • list_courses โ€” ์ˆ˜๊ฐ• ์ค‘์ธ ๊ฐ•์ขŒ ๋ชฉ๋ก
  • get_course_contents โ€” ๊ฐ•์ขŒ ์ฝ˜ํ…์ธ (์ฃผ์ฐจ๋ณ„ ์ž๋ฃŒ ๋“ฑ)
  • get_course_updates_since โ€” ๊ฐ•์ขŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๊ฐ์ง€ (ํ‘œ์ค€ Moodle ๋ชจ๋“ˆ๋งŒ โ€” ubfile/ubboard/vod๋Š” ๋ณ€๊ฒฝ๊ฐ์ง€ ์ฝœ๋ฐฑ ๋ฏธ๊ตฌํ˜„, ํฌํ•จ ์•ˆ ๋จ)
  • get_course_module โ€” cmid๋กœ ๋ชจ๋“ˆ ์ง์ ‘ ์กฐํšŒ
  • search_courses โ€” PLATO ์ „์ฒด ๊ฐ•์ขŒ ์นดํƒˆ๋กœ๊ทธ ๊ฒ€์ƒ‰ (์ˆ˜๊ฐ• ์ค‘์ธ ๊ฐ•์ขŒ๋งŒ์ด ์•„๋‹˜)
  • get_recent_courses โ€” ์ตœ๊ทผ ์ ‘์†ํ•œ ๊ฐ•์ขŒ ๋ชฉ๋ก
  • get_recent_items โ€” ์ตœ๊ทผ ์—ด์–ด๋ณธ ๊ฐ•์˜์ž๋ฃŒ/ํ™œ๋™ ๋ชฉ๋ก (๊ฐ•์ขŒ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๋ชจ๋“ˆ ๋‹จ์œ„)
  • get_starred_courses โ€” ์ฆ๊ฒจ์ฐพ๊ธฐํ•œ ๊ฐ•์ขŒ ๋ชฉ๋ก
  • list_video_conferences โ€” ํ™”์ƒ๊ฐ•์˜(BigBlueButton) ์กฐํšŒ (์ฐธ์—ฌ ๊ธฐ๋Šฅ์€ ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†๋Š” forward-looking ๊ธฐ๋Šฅ)
  • list_lessons โ€” Lesson ํ™œ๋™ ์กฐํšŒ (์‘์‹œ ๊ธฐ๋Šฅ์€ ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†์Œ)
  • list_workshops โ€” Workshop(์ƒํ˜ธํ‰๊ฐ€) ํ™œ๋™ ์กฐํšŒ (์ œ์ถœ/ํ‰๊ฐ€ ๊ธฐ๋Šฅ์€ ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†์Œ)
  • list_feedbacks โ€” Feedback(์„ค๋ฌธ) ํ™œ๋™ ์กฐํšŒ (์‘๋‹ต ๊ธฐ๋Šฅ์€ ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†์Œ)
  • list_choices / list_surveys โ€” Choice(ํˆฌํ‘œ)/Survey ํ™œ๋™ ์กฐํšŒ (์‘๋‹ต ๊ธฐ๋Šฅ์€ ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†์Œ)
  • list_scorms / list_h5p_activities โ€” SCORM/H5P ํŒจํ‚ค์ง€ ์ฝ˜ํ…์ธ  ์กฐํšŒ (์‹คํ–‰/์ถ”์  ๊ธฐ๋Šฅ์€ ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†์Œ)
  • list_glossaries โ€” Glossary(์šฉ์–ด์ง‘) ์กฐํšŒ (ํ•ญ๋ชฉ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋Š” ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†์Œ)
  • list_database_activities โ€” Database ํ™œ๋™ ์กฐํšŒ (ํ•ญ๋ชฉ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋Š” ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†์Œ)
  • list_wikis / list_chats โ€” Wiki/์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ํ™œ๋™ ์กฐํšŒ (์ฝ๊ธฐ/์“ฐ๊ธฐ๋Š” ๋ฏธ์ง€์›, ์‹ค์‚ฌ์šฉ ์‚ฌ๋ก€ ์—†์Œ)
  • get_user_profile โ€” ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์กฐํšŒ (๊ฐ™์€ ๊ฐ•์ขŒ ์ˆ˜๊ฐ•์ƒ๋งŒ, ์ „์ฒด ๊ฒ€์ƒ‰ ์•„๋‹˜)
  • get_private_files_info / add_private_file โœ๏ธ โ€” ๊ฐœ์ธํŒŒ์ผ ์˜์—ญ ์กฐํšŒ/์—…๋กœ๋“œ (โš ๏ธ ์‚ญ์ œ ๋„๊ตฌ ์—†์Œ, ์‹ค์ œ ์‚ญ์ œ๋Š” PLATO ์›น์—์„œ)
  • get_user_preferences โ€” ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ค์ • ์กฐํšŒ (๋Œ€๋ถ€๋ถ„ ๋‚ด๋ถ€ UI ์ƒํƒœ๊ฐ’)
  • get_my_course_groups โ€” ๊ฐ•์ขŒ ๋‚ด ์†Œ์† ๊ทธ๋ฃน ์กฐํšŒ
  • get_enrolled_users โ€” ๊ฐ•์ขŒ ์ˆ˜๊ฐ•์ƒ ๋ช…๋‹จ ์กฐํšŒ (PLATO ์ฐธ๊ฐ€์ž ๋ชฉ๋ก๊ณผ ๋™์ผ ์ •๋ณด)
  • list_assignments โ€” ๊ณผ์ œ ๋ชฉ๋ก
  • get_assignment_detail โ€” ๊ณผ์ œ ์ƒ์„ธ
  • submit_assignment โœ๏ธ โ€” ๊ณผ์ œ ์ œ์ถœ
  • remove_submission โœ๏ธ โ€” ๊ณผ์ œ ์ œ์ถœ ์ฒ ํšŒ (โš ๏ธ ์‹ค์ œ ์‹คํ–‰ ๊ฒฝ๋กœ๋Š” ์•„์ง PLATO์—์„œ invalidparameter ์˜ค๋ฅ˜ ๋ฐœ์ƒ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋งŒ ๋™์ž‘ ํ™•์ธ๋จ)
  • get_grades โ€” ์„ฑ์  ์กฐํšŒ
  • get_grades_access_info โ€” ์ด ๊ณ„์ •์˜ ์„ฑ์  ์กฐํšŒ ๊ถŒํ•œ ํ™•์ธ (์ „์ฒด ์—ด๋žŒ ๊ถŒํ•œ ๋“ฑ)
  • list_calendar_events โ€” ์บ˜๋ฆฐ๋” ์ผ์ •
  • get_calendar_access_info โ€” ์บ˜๋ฆฐ๋” ๊ด€๋ฆฌ ๊ถŒํ•œ ํ™•์ธ
  • create_calendar_event / delete_calendar_event โœ๏ธ โ€” ๊ฐœ์ธ ์บ˜๋ฆฐ๋” ์ผ์ • ์ƒ์„ฑ/์‚ญ์ œ (๋ณธ์ธ ์†Œ์œ  ๊ฐœ์ธ ์ผ์ •๋งŒ ๊ฐ€๋Šฅ, ๊ฐ•์ขŒ/๊ทธ๋ฃน ์ผ์ •์€ ๋ถˆ๊ฐ€)
  • get_unread_messages / get_unread_notification_count โ€” ์•ˆ ์ฝ์€ ์ชฝ์ง€ (โš ๏ธ PLATO๋Š” 1:1 ๋ฉ”์‹œ์ง•/๋Œ€ํ™” ๊ธฐ๋Šฅ์ด ์‚ฌ์ดํŠธ ์ „์ฒด์—์„œ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ โ€” ์•Œ๋ฆผ๋งŒ ๋™์ž‘)
  • get_course_completion_status โ€” ๊ฐ•์ขŒ ๋‹จ์œ„ ์ด์ˆ˜ ํ˜„ํ™ฉ (์ด์ˆ˜ ๊ธฐ์ค€์ด ์„ค์ •๋œ ๊ฐ•์ขŒ๋งŒ)
  • get_activity_completion_status โ€” ๊ฐ•์ขŒ ๋‚ด ํ™œ๋™/์ž๋ฃŒ๋ณ„ ์ด์ˆ˜ ํ˜„ํ™ฉ (๋™์˜์ƒ ๊ฐ•์˜ ์‹œ์ฒญ๋ฅ  ํฌํ•จ)
  • get_upcoming_action_events โ€” ๋งˆ๊ฐ ์ž„๋ฐ•ํ•œ ํ•  ์ผ(๊ณผ์ œ/์‹œ์ฒญ ๊ธฐํ•œ ๋“ฑ) ํ†ตํ•ฉ ์กฐํšŒ
  • get_courses_by_timeline โ€” ์ง„ํ–‰ ์ค‘/์˜ˆ์ •/์ข…๋ฃŒ ๊ฐ•์ขŒ ํ•„ํ„ฐ๋ง
  • get_grades_overview โ€” ์ „์ฒด ๊ฐ•์ขŒ ์ข…ํ•ฉ ์„ฑ์  ํ•œ ๋ฒˆ์— ์กฐํšŒ
  • list_quizzes / get_quiz_attempts / get_quiz_best_grade โ€” ํ€ด์ฆˆ ์กฐํšŒ
  • get_quiz_access_information / get_quiz_required_qtypes / get_quiz_feedback_for_grade / get_quiz_combined_review_options โ€” ํ€ด์ฆˆ ์‘์‹œ ์ „ ํ™•์ธ์šฉ ์กฐํšŒ (โš ๏ธ ์‘๋‹ต ํ˜•ํƒœ ๋ฏธ๊ฒ€์ฆ โ€” ์‹ค์ œ ํ€ด์ฆˆ๊ฐ€ ์žˆ๋Š” ๊ฐ•์ขŒ๊ฐ€ ์—†์–ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๋ผ์ด๋ธŒ๋กœ ํ™•์ธ๋จ)
  • start_quiz_attempt / get_quiz_attempt_data / save_quiz_attempt_responses / process_quiz_attempt / get_quiz_attempt_summary / get_quiz_attempt_review โœ๏ธ โ€” ํ€ด์ฆˆ ์‘์‹œ ํ๋ฆ„ (โš ๏ธ ์ „์ฒด ๋ฏธ๊ฒ€์ฆ, ์‹ค์ œ ํ€ด์ฆˆ๋กœ ๋๊นŒ์ง€ ํ…Œ์ŠคํŠธ๋œ ์  ์—†์Œ โ€” ์‚ฌ์šฉ ์ „ ๋ฐ˜๋“œ์‹œ ์žฌ๊ฒ€์ฆ ๊ถŒ์žฅ)
  • list_forums / get_forum_discussions / get_discussion_posts โ€” ํ‘œ์ค€ Moodle ํฌ๋Ÿผ ์กฐํšŒ (PLATO ์ž์ฒด ๊ณต์ง€/Q&A์ธ ubboard์™€๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ)
  • add_discussion / add_discussion_post โœ๏ธ โ€” ํฌ๋Ÿผ ๊ธ€์“ฐ๊ธฐ/๋‹ต๊ธ€

๊ณต์ง€์‚ฌํ•ญ / Q&A(ubboard) โ€” ๋กœ๊ทธ์ธ ์„ธ์…˜ ์Šคํฌ๋ ˆ์ดํ•‘

  • list_notices โ€” ๊ณต์ง€์‚ฌํ•ญ ๋ชฉ๋ก
  • get_notice_detail โ€” ๊ณต์ง€์‚ฌํ•ญ ์ƒ์„ธ
  • list_qna โ€” Q&A ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก
  • get_qna_detail โ€” Q&A ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ
  • post_qna_question โœ๏ธ โ€” Q&A ์งˆ๋ฌธ ๋“ฑ๋ก

ํŒŒ์ผ

  • download_course_file โ€” ๊ฐ•์ขŒ ์ฒจ๋ถ€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (์›๊ฒฉ ์‹คํ–‰ ์‹œ ๋งํฌ ๋ฐ˜ํ™˜, ์œ„ ๊ฐœ์ธ์ •๋ณด ์•ˆ๋‚ด ์ฐธ๊ณ )

์•„ํ‚คํ…์ฒ˜

src/plato_mcp/
โ”œโ”€โ”€ server.py            # FastMCP ์•ฑ, tool ๋“ฑ๋ก ์ง„์ž…์ 
โ”œโ”€โ”€ config.py            # Smithery config ์Šคํ‚ค๋งˆ (pnu_id, pnu_password, ...)
โ”œโ”€โ”€ auth.py              # ์„ธ์…˜๋ณ„ wstoken + requests.Session ์ฟ ํ‚ค in-memory ์บ์‹œ
โ”œโ”€โ”€ moodle_client.py     # webservice/rest/server.php ๋ฒ”์šฉ REST ํ˜ธ์ถœ ๋ž˜ํผ
โ”œโ”€โ”€ ubboard/
โ”‚   โ”œโ”€โ”€ scraper.py       # list_notices/get_notice_detail/list_qna/get_qna_detail
โ”‚   โ”œโ”€โ”€ writer.py        # post_qna_question (sesskey ์ฒ˜๋ฆฌ)
โ”‚   โ””โ”€โ”€ parser.py        # BeautifulSoup ํŒŒ์‹ฑ
โ”œโ”€โ”€ files.py             # download_course_file
โ”œโ”€โ”€ tools/                # MCP tool ๋“ฑ๋ก (courses/assignments/grades/calendar/messages/notices_qna/downloads)
โ”œโ”€โ”€ models.py              # pydantic ์‘๋‹ต ์Šคํ‚ค๋งˆ
โ”œโ”€โ”€ errors.py               # ํƒ€์ž… ์˜ˆ์™ธ (AuthError, MoodleAPIError, ScrapeError, RateLimitError)
โ””โ”€โ”€ security.py              # ๋กœ๊ทธ/์ž๊ฒฉ์ฆ๋ช… ๋งˆ์Šคํ‚น, rate limiting

์ธ์ฆ ํ๋ฆ„: ์„ธ์…˜ ์‹œ์ž‘ ์‹œ login/token.php๋กœ wstoken์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ubboard(๊ณต์ง€/Q&A) ์ ‘๊ทผ ์‹œ์—๋งŒ ์ถ”๊ฐ€๋กœ ์ฟ ํ‚ค ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•ด sesskey๋ฅผ ์Šคํฌ๋ ˆ์ดํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ๋„ ๋””์Šคํฌ์— ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ๊ฒฝ์ด ๋œ ์‚ฌ์ „ ์กฐ์‚ฌ๋Š” PLATO_MCP_์‚ฌ์ „์กฐ์‚ฌ.md, ์ „์ฒด ๋กœ๋“œ๋งต์€ PLAN.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.


๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • (๊ธฐ์—ฌ์ž์šฉ)

์•„๋ž˜๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •/๊ธฐ์—ฌํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž์šฉ ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. PLATO๋ฅผ ๊ทธ๋ƒฅ ์จ๋ณด๊ณ  ์‹ถ์€ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ๋ชฐ๋ผ๋„ ๋˜๋Š” ๋‚ด์šฉ์ด๋ฉฐ, ์‹คํ–‰ํ•ด๋„ PLATO ๊ณ„์ •์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(pytest, ruff ๋“ฑ)๋ฅผ ๋‚ด ์ปดํ“จํ„ฐ์— ์„ค์น˜ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

์‚ฌ์ „ ์š”๊ฑด

  • Python 3.11+
  • ๋กœ์ปฌ ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ์—๋Š” ์‹ค์ œ PLATO ๊ณ„์ •์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค (ํ…Œ์ŠคํŠธ๋Š” mock ๊ธฐ๋ฐ˜)
pip install -e ".[dev]"
pytest

๋ฉด์ฑ…์กฐํ•ญ

  • ๋ถ€์‚ฐ๋Œ€ํ•™๊ต(PNU) ๋˜๋Š” PLATO/๋ฌด๋“ค ํ”Œ๋žซํผ๊ณผ ์•„๋ฌด๋Ÿฐ ์ œํœด ๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฉฐ, ์ด๋“ค์˜ ์Šน์ธ์„ ๋ฐ›์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฏธ ๋ธŒ๋ผ์šฐ์ €๋กœ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ PLATO ๊ณ„์ • ์ ‘๊ทผ์„ ์ž๋™ํ™”ํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค โ€” ์ƒˆ๋กœ์šด ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์œผ๋ฉฐ PNU๋ฅผ ๋Œ€์‹ ํ•ด ์–ด๋– ํ•œ ํ–‰์œ„๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์‚ฌ์šฉ์€ ๋ณธ์ธ ์ฑ…์ž„์ด๋ฉฐ, PNU์˜ ์ด์šฉ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ณต์ง€์‚ฌํ•ญ/Q&A ๊ฒŒ์‹œํŒ(ubboard)์€ ๊ณต์‹ API๊ฐ€ ์—†์–ด ๋กœ๊ทธ์ธ๋œ ๋ณธ์ธ ์„ธ์…˜์œผ๋กœ ๋ Œ๋”๋ง๋œ HTML์„ ์ง์ ‘ ์Šคํฌ๋ ˆ์ดํ•‘ํ•˜๋Š”๋ฐ, ์ด ์‚ฌ์ดํŠธ์˜ robots.txt๋Š” Disallow: /๋ฅผ ๋ช…์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ง€์นจ์€ ์ต๋ช… ํฌ๋กค๋Ÿฌ๋ฅผ ๊ฒจ๋ƒฅํ•œ ๊ฒƒ์ด๋ฉฐ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ๋ณธ์ธ์˜ ์—ด๋žŒ ํ–‰์œ„๋ฅผ ๊ฒจ๋ƒฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์Šคํฌ๋ ˆ์ดํ•‘์ธ ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„๋ฅผ ๊ณ„์ •์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์ „์— ๋ณธ์ธ ๊ณ„์ •์— ๋Œ€ํ•œ PNU์˜ acceptable-use ์ •์ฑ…์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ฑ…์ž„์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒ์žฅ ์‚ฌ์šฉ ๋ฐฉ์‹์€ ๊ฐœ์ธ์ ยท์ €๋นˆ๋„ ์‚ฌ์šฉ์ด๋ฉฐ, ์‚ฌ์ดํŠธ ์ „์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ ์ž๋™ ๋Œ€๋Ÿ‰ ์Šคํฌ๋ ˆ์ดํ•‘์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • PLATO ๋กœ๊ทธ์ธ ์ •๋ณด๋Š” ์ด ์„œ๋ฒ„์— ์˜ํ•ด ๋””์Šคํฌ์— ์˜๊ตฌ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์ด, ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์ €์žฅ/๋ณด๊ด€๋˜๋Š”์ง€ ์ •ํ™•ํ•œ ๋‚ด์šฉ์€ SECURITY.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ์ด ํ”„๋กœ์ ํŠธ๋Š” ์ œ3์ž์— ์˜ํ•œ ๋…๋ฆฝ์ ์ธ ๋ณด์•ˆ ๊ฐ์‚ฌ๋ฅผ ๋ฐ›์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ž์ฒด์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์ž๊ฒฉ์ฆ๋ช… ์ฒ˜๋ฆฌยท์˜ค๋‚จ์šฉ ๋ฐฉ์ง€ ์ด์Šˆ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค (docs/security_audit.md, docs/abuse_prevention_review.md ์ฐธ๊ณ ) โ€” ํ•˜์ง€๋งŒ ์Šค์Šค๋กœ ์ฐพ์•„ ๊ณ ์นœ ๊ฒƒ์€ ์™ธ๋ถ€ ๊ฐ์‚ฌ์™€ ๊ฐ™์€ ์ˆ˜์ค€์˜ ๋ณด์ฆ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐœ์ธ์ •๋ณด ์•ˆ๋‚ด

์ด ์„œ๋ฒ„๋Š” ๊ฐ•์ขŒ ์ฝ˜ํ…์ธ ๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค โ€” Q&A ๊ฒŒ์‹œํŒ์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ•™์ƒ๋“ค์˜ ์ด๋ฆ„๊ณผ ๊ฒŒ์‹œ๊ธ€๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณธ์ธ ๊ณ„์ •์ด PLATO๋ฅผ ํ†ตํ•ด ์ด๋ฏธ ์ •๋‹นํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์ด๋ฉฐ, ์ด ๋„๊ตฌ๊ฐ€ ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋กœ PLATO๋ฅผ ์ง์ ‘ ์—ด๋žŒํ•  ๋•Œ์™€ ๋‹ค๋ฅธ ์ ์€, ์ด ๋‚ด์šฉ์ด AI ์–ด์‹œ์Šคํ„ดํŠธ์™€ ๋‚˜๋ˆ„๋Š” ๋Œ€ํ™”์˜ ์ผ๋ถ€๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰ ๋„๊ตฌ ์ถœ๋ ฅ์œผ๋กœ์„œ ํ•ด๋‹น AI/LLM ์ œ๊ณต์—…์ฒด(์˜ˆ: Anthropic)์— ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ฐ•์ขŒ Q&A ๊ฒŒ์‹œํŒ์„ ๋Œ€์ƒ์œผ๋กœ ํญ๋„“์€ ์งˆ๋ฌธ์„ ํ•˜๊ธฐ ์ „์— ์ด ์ ์„ ์œ ๋…ํ•˜์„ธ์š”.

์ „์ฒด ๊ฒ€ํ†  ๋‚ด์šฉ๊ณผ ์•Œ๋ ค์ง„ ๋ฏธํ•ด๊ฒฐ ์‚ฌํ•ญ(PLATO๊ฐ€ Q&A ๊ฒŒ์‹œ๊ธ€์˜ "๋น„๊ณต๊ฐœ/๊ฐ•์‚ฌ ์ „์šฉ" ํ”Œ๋ž˜๊ทธ๋ฅผ ์„œ๋ฒ„ ์ธก์—์„œ ์‹ค์ œ๋กœ ๊ฐ•์ œํ•˜๋Š”์ง€ โ€” ์ฆ‰ ์ด ๋„๊ตฌ๊ฐ€ ๊ทธ๋Ÿฐ ๊ฒŒ์‹œ๊ธ€์„ ์• ์ดˆ์— ๋ณผ ์ˆ˜ ์—†๋Š”์ง€ โ€” ์—ฌ๋ถ€๋Š” ์•„์ง ์‹ค์ฆ์ ์œผ๋กœ ๊ฒ€์ฆ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค)์€ docs/pii_review.md์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›๊ฒฉ์œผ๋กœ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ (๋กœ์ปฌ Claude Code/Desktop์ด ์•„๋‹ˆ๋ผ Claude.ai ์ปค๋„ฅํ„ฐ ๋“ฑ์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ), ์ธ๋ผ์ธ ์ „์†ก ํฌ๊ธฐ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋Š” ํฐ ํŒŒ์ผ์— ๋Œ€ํ•ด download_course_file์€ ํŒŒ์ผ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด ๋งํฌ์—๋Š” ์‚ด์•„์žˆ๋Š” PLATO ์•ก์„ธ์Šค ํ† ํฐ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ† ํฐ์€ ํ•ด๋‹น ํŒŒ์ผ ํ•˜๋‚˜์—๋งŒ ํ•œ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์‹ค์ œ๋กœ ํ™•์ธํ•ด ๋ณธ ๊ฒฐ๊ณผ ๋ณธ์ธ ๊ณ„์ •์— ๋Œ€ํ•œ ์ž„์˜์˜ PLATO API ํ˜ธ์ถœ์„ ์ธ์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งํฌ๋‚˜ ์ด ๋งํฌ๊ฐ€ ํฌํ•จ๋œ ๋Œ€ํ™” ๊ธฐ๋ก์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์€ ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ณ„์ •์— ๋Œ€ํ•œ ํ™œ์„ฑ ์ž๊ฒฉ์ฆ๋ช…์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ SECURITY.md์™€ docs/smithery_deployment_model.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  • Lint: ruff check .
  • ์ด์Šˆ/๋ณด๋“œ ์šด์˜ ๋ฐฉ์‹์€ PLAN.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ๊ธฐ์—ฌ ๋ฐฉ๋ฒ•์€ CONTRIBUTING.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋ผ์ด์„ ์Šค

AGPL-3.0์ž…๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„(๋˜๋Š” ์ˆ˜์ •๋ณธ)๋ฅผ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค๋กœ ๋Œ๋ ค ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ, AGPL์— ๋”ฐ๋ผ ํ•ด๋‹น ์†Œ์Šค์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๊ณต๊ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Reviews

No reviews yet

Be the first to review this server!