ssuMCP
Provides integration with Canvas LMS for accessing assignments, quizzes, and other course data via SSO.
ssuAI
한국어 · English
공개 캠퍼스 정보, 개인 학사·LMS·도서관 데이터, 승인 기반 AI 작업을 하나의 웹 경험으로 연결한 Next.js 애플리케이션이다. 브라우저에 비밀 값을 노출하지 않으면서 대시보드와 SSE 챗봇을 제공한다.
라이브 앱 · 챗봇 · 플랫폼 사례 연구 · 문서 지도

플랫폼에서 맡는 역할
서비스 | 책임 | 저장소 |
ssuAI | 사용자 화면, same-origin BFF, 인증 상태와 SSE/HITL UX | 현재 저장소 |
ssuAgent | LangGraph 라우팅, 대화 상태, HITL 오케스트레이션 | |
ssuMCP | 캠퍼스 도메인 로직, MCP/REST 계약, 인증과 상태 변경 | |
ssu-ai-service | 격리된 임베딩 요청 게이트웨이 |
이 저장소는 프론트엔드와 BFF 경계만 소유한다. 학교 시스템 연동과 데이터 정합성은 ssuMCP,
자연어 라우팅과 대화 checkpoint는 ssuAgent의 책임이다.
Related MCP server: studieplus-mcp
제품 흐름
사용자 경로 | 제공 기능 | 신뢰 경계 |
공개 조회 | 학식, 공지, 시설, 학사일정, 도서 검색, 실시간 좌석 현황 | credential 없는 GET/SSE만 backend origin으로 직접 호출 가능 |
연결된 대시보드 | 시간표, 성적, 졸업요건, 채플, 장학, LMS 과제, 대출 | access token은 메모리, refresh와 provider session은 same-origin 경로 |
AI 챗봇 | 도메인 handoff, 도구 진행 상태, 스트리밍 답변 | 서버 route가 agent key와 검증된 principal을 주입 |
상태 변경 | 좌석 예약·반납, LMS 자료 내보내기 |
|
홈, 학사, 도서관, 캠퍼스, 챗봇은 데스크톱 사이드바와 모바일 하단 탐색을 공유한다. 디자인 결정과 접근성 기준은 UI redesign ADR에 기록했다.
웹과 모바일을 한 코드베이스로 만드는 방식
별도 네이티브 앱을 두지 않고 하나의 Next.js 반응형 웹을 사용한다. AppShell은 Tailwind의 lg
분기에서 데스크톱의 246px 고정 사이드바를 모바일의 상단 바와 5개 하단 탭으로 바꾸고, 하단 탭에는
safe-area-inset-bottom을 적용한다. 같은 데이터와 상태 로직을 공유하면서 홈 위젯은 3열에서 1열로,
주간 시간표는 월–금 5열에서 오늘 우선 목록으로 표현만 전환한다.
모바일 브라우저에서는 device-width, dvh 기반 채팅 높이와 16px 입력창을 사용한다. 핀치 줌을
막지 않으면서 iOS 입력 포커스의 자동 확대를 피하는 방식이다. 따라서 데스크톱과 모바일은 배포물도
하나이고, 화면 폭에 따른 탐색·배치만 달라진다.
챗봇에서 LMS 강의자료 일괄 받기
자연어 요청을 받은 ssuAgent가 LMS 도메인으로 전환해 인증과 학기 목록을 확인하고, ssuMCP의
비동기 내보내기를 시작한다. 준비된 제한 링크는 채팅 안에서 다운로드 버튼으로만 렌더링하며,
허용된 origin과 path를 통과하지 못한 링크는 일반 텍스트로 남긴다.

실명과 개인 학사·재정·대출·좌석 값은 공개 이미지에서 비식별화했다.
모바일 홈 | 모바일 챗봇 | 모바일 학사 |
|
|
|
도서관 실시간 좌석 | 학사 대시보드 |
|
|
캠퍼스 정보 | 서비스 연결 상태 |
|
|
좌석 예약 승인 요청 | 승인 후 완료 |
|
|
아키텍처
공개 GET/SSE는 선택적으로 backend origin을 직접 호출해 Vercel 함수 hop을 줄인다. 쿠키·Bearer·API
key가 필요한 요청과 /api/agent/*는 항상 same-origin 서버 경로를 통과한다. 이 분리는 public CORS를
인증 surface로 확장하지 않으면서도 공개 데이터의 지연을 줄인다. 상세 흐름은
프론트엔드 아키텍처에 있다.
엔지니어링 근거
문제 | 구현과 검증 근거 |
공개 성능 최적화가 인증 경계를 넓힐 위험 | 공개 GET/SSE allow-list와 server-only proxy 분리 — ADR 0087 · boundary tests |
SSO redirect에서 브라우저 쿠키가 유실되는 문제 | 1회용 code를 200 응답에서 교환 — ADR 0089 · return-page tests |
UI 연결 표시와 실제 MCP 권한의 불일치 | backend grant를 단일 근거로 사용하고 session 발급을 single-flight 처리 — ADR 0099 |
스트림 중단 뒤 HITL 상태 또는 최종 링크 유실 | thread-stable SSE, resume endpoint, 제한된 안전 링크 렌더링 — chat tests · message tests |
브라우저가 agent key, principal, limiter identity를 조작할 위험 | server route가 bearer를 검증하고 pseudonymous client identity를 서명 — ADR 0086 · proxy tests |
대화 capability의 장기 저장과 삭제 부재 | proxy가 strict body/ID 경계를 적용하고 owner 검증 DELETE API를 중계 — agent client |
변경이 UI에서만 우연히 동작하는 문제 | lint, TypeScript, Vitest, production build를 모두 요구 — CI workflow |
정적 보안 회귀와 stale dependency | CodeQL v4 JS/TS 분석, npm·GitHub Actions Dependabot — CodeQL · Dependabot |
주요 스택은 Next.js 16.2.12, React 19, TypeScript 6, TanStack Query, Tailwind CSS, Radix UI, Vitest, Testing Library, Playwright, axe-core와 Vercel이다.
로컬 실행과 검증
Node.js 20과 pnpm 10을 사용한다. 로컬 backend 없이 공개 ssuMCP를 대상으로 실행할 수도 있다.
git clone https://github.com/ghdtjdwn/ssuAI.git
cd ssuAI
cp .env.example .env.local
pnpm install --frozen-lockfile
pnpm dev로컬 ssuMCP 없이 공개 backend를 사용할 때는 .env.local의 active localhost 값을 다음처럼 바꾼다.
NEXT_PUBLIC_SSUAI_API_BASE=https://ssumcp.duckdns.org
NEXT_PUBLIC_BACKEND_ORIGIN=https://ssumcp.duckdns.orgpnpm lint
pnpm typecheck
pnpm test
pnpm build
pnpm exec playwright install chromium
pnpm test:e2etest:e2e는 데스크톱과 모바일 Chromium에서 핵심 5개 화면의 탐색 가능성, browser/React
pageerror 0건, WCAG 2.0/2.1 A·AA 중 critical/serious axe 위반, 홈 화면의 실험실
LCP 2.5초·CLS 0.1 예산을 검사한다. 학교 API
요청은 503 fixture로 차단하므로 실제 학생 데이터나 외부 시스템 상태를 건드리지 않는다. 검증
서버는 기본적으로 새로 기동하며, 의도적으로 실행 중인 ssuAI 서버를 검사할 때만
E2E_REUSE_SERVER=true를 설정한다. 실패 시 trace·화면·Web Vitals JSON이 test artifact로 남는다.
이 검증은 로컬 production build의 회귀 게이트이지 실사용자 네트워크의 현장 RUM, 인증 여정 또는
학교 시스템 가용성의 증거가 아니다. 서비스별 실험 조건과 운영 주장 한계는
docs/portfolio-verification-boundary.md에 기록했다.
2026-07-27에 Next.js 16.2.12와 전이 의존성 패치 버전을 고정하고 확인한 pnpm audit --prod 0건도 당시 registry advisory
스냅샷이며 런타임 침투 테스트를 뜻하지 않는다.
환경 변수와 server-only/public 구분은 .env.example에 있다. 운영 proxy target과
secret 변경은 Vercel 설정과 함께 검증해야 하며, localhost 기본값으로 운영 구성을 추정하지 않는다.
문서
범위와 제약
숭실대학교 공식 서비스가 아니며, 외부 학교 시스템의 가용성을 보장하지 않는다.
개인 화면과 상태 변경은 유효한 학교 계정 및 provider 연결이 필요하다.
CI는 코드의 빌드·테스트를 검증하며 Vercel 환경 변수나 외부 서비스의 종단 동작까지 증명하지 않는다.
라이선스
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseAqualityBmaintenanceMCP server for querying Chosun University portal, CLC/e-Class, and OJ systems, providing tools to access academic information, timetables, notices, and more.Last updated13
- Alicense-qualityCmaintenanceMCP server that gives Claude Desktop access to school data from Studie+ (Danish school platform), enabling queries about schedules, homework, assignments, and files directly in chat.Last updatedMIT
- Flicense-qualityCmaintenanceAn MCP server for interacting with the MyDy (Moodle-based) LMS, enabling attendance viewing, course browsing, assignment and grade checking, announcement reading, and material downloading.Last updated7
- Alicense-qualityBmaintenanceMCP server that provides tools to interact with SNU eTL (Canvas LMS), including viewing courses, assignments, announcements, grades, downloading and organizing course files, with persistent local storage and automatic sync.Last updatedMIT
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
MCP server for AgentDocs (agentdocs.eu): read, search, write, comment on & share Markdown docs.
An MCP server for deep research or task groups
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ghdtjdwn/ssuAI'
If you have feedback or need assistance with the MCP directory API, please join our Discord server








