Skip to main content
Glama

BIT101 MCP

베이징이공대학(北京理工大学) 학생을 위한 로컬, 읽기 전용 Model Context Protocol(MCP) 서비스입니다. BIT101 커뮤니티 콘텐츠, 강의 평가, 개인 시간표, 성적, 러쉐(乐学) 캘린더를 Agent가 이해하기 쉬운 구조화된 데이터로 변환하여 자연어로 직접 질문할 수 있게 해줍니다.

[!IMPORTANT] 이 프로젝트는 비공식 커뮤니티 프로젝트로, 베이징이공대학 및 BIT101 공식과는 아무런 관련이 없습니다. Windows에서 주요流程 실기 테스트를 완료했고, Fedora 43 + niri에서 실행 가능함을 확인했습니다. 프로젝트는 아직 MVP 단계입니다. 사용 전에 인증, 보안 및 개인정보 보호를 읽어주세요.

할 수 있는 일

  • 오늘의 BIT101 게시물 요약 또는 키워드로 과거 토론 검색

  • 강의, 교수, 역대 학생 평가 조회

  • 오늘, 이번 주, 다음 주 또는 지정 학기의 시간표 조회

  • 성적, 학점, 학급 평균 및 최고점 조회(상위 서비스가 제공하는 경우)

  • 향후 기간의 러쉐 캘린더 이벤트 조회

  • 서로 다른 출처의 데이터를 조합하여 "다음 학기 강의 교수에 대한 사람들의 평가는 어떤가요?" 같은 질문에 답변

모든 도구는 읽기 전용입니다. 프로젝트는 게시, 좋아요, 댓글, 과제 제출, 성적 변경 또는 학교 데이터 수정을 할 수 없습니다.

Related MCP server: iGuat-MCP

실기 데모

다음 스크린샷은 Windows의 OpenCode cli 실기 호출 결과입니다. 구체적인 답변은 사용된 모델이 MCP가 반환한 데이터를 기반으로 생성한 것으로, 프로젝트 작성자의 의견을 대변하지 않으며 모델 및 데이터 업데이트에 따라 변경될 수 있습니다.

오늘의 게시물 요약

Agent가 list_today_posts를 호출하여 당일 게시물을 가져온 후 제목, 내용, 상호작용 현황을 바탕으로 간단한 요약을 생성합니다.

BIT101 오늘의 게시물 요약

교수 및 강의 평가

Agent가 먼저 교수에 해당하는 강의를 검색한 후 get_course_reviews를 호출하여 강의 메타데이터, 평점, 리뷰 및 과거 정보를 집계합니다.

교수 및 강의 평가 집계

전공 방향 토론

강의 라이브러리에 완전히 일치하는 항목이 없을 때 Agent는 BIT101 게시물을 계속 검색하고 관련 토론을 읽을 수 있으며, 여러 MCP 도구를 연속으로 사용하는 효과를 보여줍니다.

전공 방향 관련 토론 요약

러쉐 캘린더

Agent는 7~90일 내의 러쉐 이벤트를 조회할 수 있습니다. 유효한 캘린더에 최근 작업이 없으면 "작업 없음"을 인터페이스 오류로 오판하지 않고 정상적으로 빈 목록을 반환합니다.

러쉐 최근 작업 조회

사용 전 준비

현재 권장 환경:

  • Windows 10/11, 또는 데스크톱 브라우저와 사용 가능한 시스템 keyring이 있는 Linux(Fedora 43 + niri 실측 완료)

  • Python 3.11 이상

  • uv

  • 로컬 stdio MCP를 지원하는 클라이언트(예: Codex, OpenCode, Cursor 또는 Claude Code)

  • BIT101 계정

  • 시간표, 성적 조회 시 베이징이공대학 통합 인증 계정도 필요합니다. 일부 로그인은 SMS 인증이 필요할 수 있습니다.

  • 러쉐 조회 시 러쉐에서 개인 캘린더 구독 주소를 한 번 내보내야 합니다.

설치

Agent에게 지시하기(권장)

Agent가 터미널 명령을 실행하고 자신의 MCP 구성을 수정할 수 있다면, 다음 내용을 그대로 보내면 됩니다:

请帮我安装并配置 BIT101 MCP:
https://github.com/tiny-paris/BIT101-mcp

要求:
1. 先阅读仓库 README,尤其是“认证、安全与隐私”部分,并告诉我它会访问哪些服务。
2. 检查本机是否安装 Python 3.11+、Git 和 uv;缺少时说明后再安装。
3. 优先使用以下命令安装为用户级工具:
   uv tool install "git+https://github.com/tiny-paris/BIT101-mcp.git"
4. 识别我当前使用的 MCP 客户端,将 bit101-mcp 配置为用户级/全局 stdio MCP,
   名称使用 bit101,单次工具执行超时至少设置为 360 秒。
5. 如果找不到命令,运行 uv tool dir --bin,并在 MCP 配置中使用
   bit101-mcp(Windows 为 bit101-mcp.exe)的绝对路径。
6. 重启或重新加载 MCP,验证服务器已连接并能列出工具。
7. 不要在聊天、命令行参数、配置文件或环境变量中向我索要或写入账号、密码、
   短信验证码、Cookie、token 或乐学订阅 URL。需要认证时,只让我在 MCP 自动打开的
   127.0.0.1 临时页面中操作。
8. 不要修改默认上游地址。完成后告诉我修改了哪些配置文件以及验证结果。

Agent가 설치를 완료한 후 새 대화에서 "오늘의 BIT101 게시물 요약"을 물어보면 최초 필요 시 인증이 트리거됩니다.

소스에서 설치

저장소가 공개된 후 다음을 실행할 수 있습니다:

git clone https://github.com/tiny-paris/BIT101-mcp.git
cd BIT101-mcp
uv sync --all-groups
uv tool install .

uv tool install .는 bit101-mcp를 사용자 수준 명령으로 설치합니다. 다음 명령으로 uv의 실행 파일 디렉터리를 확인할 수 있습니다:

uv tool dir --bin

MCP 클라이언트가 bit101-mcp를 찾지 못하면 클라이언트를 재시작하거나, 구성에서 해당 디렉터리의 bit101-mcp.exe 절대 경로를 사용하세요.

소스 디렉터리 내에서만 실행

개발 또는 테스트 시 명령을 설치하지 않고도 실행할 수 있습니다:

uv sync --all-groups
uv run bit101-mcp

stdio MCP는 정상적으로 시작되면 조용히 프로토콜 메시지를 기다리므로 "멈춘 것처럼" 보이는 것이 정상입니다. 일반 대화형 명령으로 취급하지 말고, 터미널에 계정이나 비밀번호를 입력하지 마세요.

[!NOTE] 프로젝트가 PyPI에 게시된 후에야 간단한 uvx bit101-mcp가 지원됩니다. 현재 README는 PyPI 패키지가 이미 존재한다고 가정하지 않습니다.

의존성 설명

프로젝트는 7개의 런타임 직접 의존성을 선언합니다. 이들은 모두 "MCP 프로토콜 필수 요구사항"이 아니라 현재 전체 기능에 각각 필요한 구성 요소입니다:

의존성

프로젝트 내 용도

현재 삭제 가능 여부

mcp

MCP stdio 서버, 도구 등록, 컨텍스트 및 프로토콜 유형

불가능; 핵심 의존성

httpx

BIT101, BIT-Login 및 러쉐 캘린더에 접근하는 비동기/동기 HTTPS 클라이언트

불가능; 모든 데이터와 인증에 네트워크 필요

keyring

세션 및 러쉐 구독 주소를 운영 체제 자격 증명 저장소에 저장

불가능; 삭제 시 프로세스 간 세션 재사용을 안전하게 할 수 없음

icalendar

러쉐에서 내보낸 ICS/iCalendar 검증 및 파싱

불가능; 러쉐 기능 및 시작 시 가져오기에 사용

python-dateutil

러쉐 캘린더의 반복 규칙(RRULE) 확장

불가능; 주기 이벤트에 필요

pydantic

MCP 도구 매개변수 범위 및 JSON 스키마(예: 게시물 수, 주 오프셋, 조회 일수)

불가능; 소스에서 직접 사용하며 MCP SDK도 이를 기반으로 함

tzdata

Windows에서 zoneinfo에 Asia/Shanghai 시간대 데이터베이스 제공

삭제 비권장; 그렇지 않으면 일부 Windows/Python 환경에서 "오늘" 및 학사 주를 올바르게 계산할 수 없음

따라서 현재 단일 패키지 버전에서는 이 7개 모두 실행 의존성입니다. 그러나 기능적으로 icalendar와 python-dateutil은 러쉐에만 사용되므로, 향후 선택 기능으로 분리하면 추가 의존성으로 변경할 수 있습니다. 지금 분리하면 설치 및 오류 보고 복잡성이 증가하고 절약되는 용량도 제한적입니다.

uv.lock에는 anyio, httpcore, certifi 등의 간접 의존성도 보이는데, 이들은 위 라이브러리가 자동으로 가져온 것으로 프로젝트가 직접 호출하는 최상위 구성 요소가 아니므로 별도로 수동 설치하거나 삭제해서는 안 됩니다.

다음 의존성은 개발 및 배포에만 사용되며 일반 실행 의존성으로 설치되지 않습니다:

의존성

용도

pytest, pytest-asyncio

자동화 테스트

ruff

코드 검사 및 형식 검사

hatchling

소스 패키지 및 wheel 빌드

MCP 클라이언트 구성

최초 학교 인증은 최대 몇 분이 걸릴 수 있으므로 단일 도구 호출 타임아웃을 360초로 설정하는 것이 좋습니다. 구성 완료 후 MCP 클라이언트를 재시작하여 새 서비스 프로세스를 시작해야 합니다.

Codex

Codex CLI, Codex IDE 확장 및 ChatGPT 데스크톱의 Codex 호스트는 config.toml의 MCP 구성을 공유합니다. 공식 문서는 Codex MCP 문서를 참조하세요.

먼저 CLI로 추가:

codex mcp add bit101 -- bit101-mcp
codex mcp list

그런 다음 사용자 수준 %USERPROFILE%\.codex\config.toml을 확인하고 도구 타임아웃을 보완:

[mcp_servers.bit101]
command = "bit101-mcp"
tool_timeout_sec = 360

특정 신뢰할 수 있는 프로젝트에서만 활성화하려면 동일한 구성을 해당 프로젝트의 .codex/config.toml에 넣을 수 있습니다. 사용자 수준 구성은 모든 디렉터리와 새 대화에서 사용할 수 있습니다.

명령이 Codex의 PATH에 없으면 절대 경로로 변경할 수 있습니다:

[mcp_servers.bit101]
command = 'C:\path\to\bit101-mcp.exe'
tool_timeout_sec = 360

OpenCode

이 프로젝트는 아래의 기존 OpenCode 구성으로 Windows 실기 테스트를 완료했습니다. 프로젝트 루트의 opencode.json은 해당 프로젝트에만 적용됩니다. 모든 디렉터리에서 사용하려면 사용자 수준 ~/.config/opencode/opencode.json에 넣으세요(Windows에서는 일반적으로 %USERPROFILE%\.config\opencode\opencode.json에 해당).

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bit101": {
      "type": "local",
      "command": ["bit101-mcp"],
      "enabled": true,
      "timeout": 360000
    }
  }
}

연결 확인:

opencode mcp list

소스 디렉터리에서만 시작할 수 있다면 일반적으로 구성이 상대 명령을 사용하고 전역 설치가 없기 때문입니다. bit101-mcp를 설치하거나 command를 .venv\Scripts\bit101-mcp.exe의 절대 경로로 변경하면 됩니다.

OpenCode V2의 구성 구조는 다르며, 서비스는 mcp.servers 아래에 있고 실행 타임아웃은 mcp.timeout.execution에 있습니다. OpenCode MCP 공식 문서를 기준으로 하세요:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "timeout": {
      "execution": 360000
    },
    "servers": {
      "bit101": {
        "type": "local",
        "command": ["bit101-mcp"]
      }
    }
  }
}

Cursor

Cursor MCP 문서에 따라 전역 구성은 ~/.cursor/mcp.json에, 프로젝트 구성은 .cursor/mcp.json에 둡니다:

{
  "mcpServers": {
    "bit101": {
      "command": "bit101-mcp",
      "args": []
    }
  }
}

저장 후 Cursor를 재시작하고 Agent의 사용 가능한 도구 목록에서 bit101이 활성화되었는지 확인하세요.

Claude Code

Claude Code MCP 문서에 따라 사용자 수준 stdio 서비스를 추가하세요:

claude mcp add --scope user bit101 -- bit101-mcp
claude mcp list

일반 stdio 구성

다른 MCP 클라이언트는 로컬 stdio 프로세스 하나만 구성하면 됩니다:

{
  "command": "bit101-mcp",
  "args": []
}

계정, 비밀번호, Cookie, 토큰 또는 러쉐 URL을 MCP 구성, 환경 변수 또는 도구 매개변수에 작성하지 마세요.

사용 시작

구성 완료 후 Agent 대화에서 직접 질문하면 되며, 백그라운드 서비스를 수동으로 시작할 필요가 없습니다. 예:

BIT101 커뮤니티 및 강의

总结一下今天 BIT101 都有哪些帖子。
查找最近关于“数据结构”的讨论。
如何评价某某老师的某门课?请区分普遍评价和少数意见。
查找“特立自动化”相关讨论,并列出信息来源。

시간표 및 성적

我今天有什么课?
我下周有什么课?按实际日期和开始时间排序。
列出本学期完整课表。
列出我的所有成绩,包括课程、学期、学分、成绩、班级平均分和最高分。

"이번 주/다음 주"를 물어보면 서버가 현재 날짜를 기준으로 정확한 주차를 계산하고 starts_at, ends_at 등의 전체 시간을 반환합니다. Agent가 학사 주나 교시 시간을 직접 추측할 필요가 없습니다.

러쉐

未来 14 天有哪些乐学任务?按截止时间排序。
看看未来 30 天的乐学日历。

사용 가능한 도구

도구

역할

필요한 인증

list_today_posts

상하이 시간대 기준 당일 게시된 BIT101 게시물 가져오기

BIT101

search_posts

BIT101 게시물 검색

BIT101

get_post

지정 게시물 및 관련 정보 읽기

BIT101

search_courses

강의 및 교수 검색

BIT101

get_course_reviews

강의, 교수, 리뷰 및 과거 강의 정보 집계

BIT101

get_today_schedule

오늘의 강의 가져오기

학교 통합 인증

get_week_schedule

이번 주, 다음 주 또는 상대 주의 날짜 포함 시간표 가져오기

학교 통합 인증

get_schedule

현재 또는 지정 학기의 전체 시간표 가져오기

학교 통합 인증

get_scores

성적 및 가능한 학급 통계 가져오기

학교 통합 인증

get_upcoming_lexue_tasks

향후 1~90일의 러쉐 캘린더 이벤트 파싱

학교 인증 + 러쉐 구독 주소

성공 결과는 통일된 형식입니다:

{
  "ok": true,
  "data": {}
}

실패 결과에는 상위 서비스 스택 또는 인증 정보가 포함되지 않습니다:

{
  "ok": false,
  "error": {
    "code": "UPSTREAM_UNAVAILABLE",
    "service": "bit101",
    "message": "BIT101 is temporarily unavailable.",
    "retryable": true
  }
}

기술 원리

핵심은 네 계층으로 나뉩니다:

  1. MCP 도구 계층: 게시물, 강의, 시간표, 성적, 작업 등의 사용자 개념만 노출하고 Cookie, 챌린지 토큰 또는 내부 서비스 식별자는 노출하지 않습니다.

  2. 클라이언트 계층: BIT101 API와 학교 데이터 게이트웨이를 각각 처리하며, 요청 실패 시 세션 만료 여부를 판단하고 복구 가능한 재시도를 한 번만 수행합니다.

  3. 표준화 계층: 서로 다른 상위 서비스 형식을 안정적이고 JSON 친화적인 필드로 변환합니다. 상하이 시간대 날짜, 학사 주, 강의 시간, 성적 및 ICS 이벤트 파싱을 담당합니다.

  4. 인증 및 저장 계층: 필요할 때만 로컬 페이지를 엽니다. 비밀번호는 MCP 매개변수에 들어가지 않으며, 성공 후 재사용 가능한 세션만 저장합니다.

MCP는 stdio transport를 사용합니다. 표준 출력은 MCP 프로토콜 데이터만 보내고, 실행 로그는 표준 오류에만 기록하여 로그가 프로토콜 통신을 방해하지 않도록 합니다.

인증 프로세스

브라우저의 BIT101 로그인을 직접 재사용할 수 없는 이유는?

브라우저 Cookie는 브라우저 자체의 보안 공간에 속하며, MCP는 독립적인 로컬 프로세스입니다. 프로젝트는 의도적으로 Chrome/Edge의 Cookie 데이터베이스를 읽지 않으며 브라우저 확장 프로그램 설치도 요구하지 않습니다. 이로 인해 최초 인증이 한 번 더 필요하지만, MCP가 사용자의 모든 브라우저 자격 증명을 스캔하는 것을 피할 수 있습니다.

새 Agent 대화를 시작한다고 해서 로그인 상태가 지워지지는 않습니다. MCP 시작 시 저장된 세션을 읽고 검증합니다. 세션이 없거나, 상위 서비스가 무효로 판정하거나, 인증 게이트웨이의 임시 챌린지가 만료되었거나, 시스템 자격 증명 저장소를 사용할 수 없는 경우에만 다시 로그인합니다.

BIT101

커뮤니티 도구를 처음 호출할 때:

  1. MCP가 127.0.0.1의 임의 포트에서 임시 페이지를 시작합니다.

  2. 사용자가 로컬 페이지에 학번과 BIT101 비밀번호를 입력합니다.

  3. 로컬 프로세스가 기존 BIT101 로그인 프로토콜에 따라 비밀번호를 처리하고 HTTPS를 통해 BIT101 API에 요청합니다.

  4. 로그인 성공 후 반환된 BIT101 세션만 시스템 자격 증명 관리자에 저장합니다. 원본 비밀번호는 영속화하지 않습니다.

  5. 임시 페이지가 닫히고 원래 도구 호출이 계속 실행됩니다.

학교 시간표 및 성적

시간표와 성적은 학교 개인 데이터 기능에서 오며 BIT101 커뮤니티 세션과는 다른 "열쇠"입니다. 최초 호출 시 로컬 페이지가 통합 인증 계정, 비밀번호 및 필요 시 SMS 인증 코드를 수집하고 HTTPS를 통해 기존 BIT-Login REST 게이트웨이에 전달합니다. MCP는 게이트웨이가 반환한 단기 챌린지 세션을 저장하며 학교 비밀번호는 저장하지 않습니다.

러쉐 캘린더

현재 BIT-Login REST 게이트웨이는 이 프로젝트가 호출할 수 있는 러쉐 캘린더 인터페이스를 제공하지 않으며, 프로젝트도 학교 CAS/SSO를 다시 구현하지 않습니다. 따라서 MVP는 사용자가 러쉐의 캘린더 → 캘린더 내보내기 페이지에서 개인 구독 주소를 생성하고 로컬 연결 페이지에 한 번 붙여넣어야 합니다.

연결 페이지는 실제로 iCalendar 콘텐츠를 다운로드하여 검증하며, 유효한 구독만 Connected를 표시합니다. 일반 calendar/view.php 페이지는 거부됩니다. 구독 주소는 Agent 또는 MCP 도구 결과에 들어가지 않으며 시스템 자격 증명 관리자에 저장됩니다. 최근 이벤트가 없는 유효한 캘린더는 빈 목록을 반환합니다.

인증, 보안 및 개인정보 보호

먼저 결론

이 프로젝트는 비밀번호가 Agent, 채팅 기록 및 로그에 들어갈 위험을 줄이지만 "제로 리스크"를 약속할 수는 없습니다. 로컬 MCP를 설치하는 것은 네트워크에 연결할 수 있는 로컬 프로그램을 설치하는 것과 같습니다. 사용자는 프로젝트 소스 코드, 설치 패키지, 의존성 및 구성된 원격 인증 서비스를 신뢰해야 합니다.

특히 두 문장을 구분해야 합니다:

  • 비밀번호는 Agent/LLM에 전송되지 않습니다: 이 프로젝트가 명시적으로 구현한 경계입니다.

  • 비밀번호는 이 기기에서만 존재합니다: 아닙니다. 학교 통합 인증 비밀번호는 로컬 MCP가 HTTPS를 통해 구성된 원격 BIT-Login 게이트웨이에 제출하여 인증을 완료해야 합니다.

어떤 정보가 어디로 갈까요?

정보

누가 접촉하나

영속화 여부

BIT101 비밀번호

로컬 인증 코드; 상위 프로토콜에 따라 처리 후 BIT101 API에 제출

비밀번호 미저장

학교 통합 인증 비밀번호

로컬 인증 코드 및 구성된 BIT-Login 게이트웨이

미저장

SMS 인증 코드

로컬 인증 코드 및 BIT-Login 게이트웨이

미저장

BIT101/학교 세션

로컬 MCP 및 해당 상위 서비스

운영 체제 자격 증명 저장소

러쉐 개인 구독 주소

로컬 MCP 및 bit.edu.cn 캘린더 서비스

운영 체제 자격 증명 저장소

게시물, 강의, 시간표, 성적, 러쉐 이벤트

MCP 및 현재 Agent

현재 Agent 컨텍스트에 들어감

기본 상위 서비스 주소:

  • BIT101 API: https://bit101.flwfdd.xyz

  • BIT-Login REST: https://login.bit101.flwfdd.xyz

HTTPS는 일반적인 네트워크 도청을 방지할 수 있지만 서버 운영 주체에 대한 신뢰를 대체할 수는 없습니다. 학교 비밀번호가 원격 게이트웨이를 거치는 것이 우려되는 사용자는 시간표 및 성적 도구를 활성화하지 않아야 합니다.

구현된 보호 조치

  • 임시 HTTP 서비스는 127.0.0.1에만 바인딩되며 운영 체제가 할당한 임의 포트를 사용합니다.

  • 각 인증은 256비트 임의 state를 사용하며 위조 제출에 대비해 상수 시간 비교를 수행합니다.

  • 페이지는 캐시, 외부 콘텐츠, iframe, referrer 및 MIME 추측을 비활성화합니다.

  • 페이지는 성공, 취소 또는 타임아웃 후 수신 대기를 중지합니다.

  • 비밀번호, 인증 코드는 파일에 기록되지 않습니다. 코드는 요청 후 관련 변수 참조를 가능한 한 빨리 정리합니다.

  • 세션은 Python keyring을 통해 운영 체제 자격 증명 저장소(Windows Credential Manager 또는 Linux의 Secret Service/keyring 백엔드)에 기록됩니다. 사용할 수 없으면 현재 프로세스 메모리에만 저장하고 평문 파일로 폴백하지 않습니다.

  • 로그는 비밀번호, 인증 코드, Cookie, Bearer token 및 Authorization 헤더를 마스킹합니다.

  • 러쉐 주소는 bit.edu.cn 도메인의 HTTPS여야 하며 유효한 iCalendar를 반환해야 합니다.

  • 모든 도구는 읽기 전용으로 표시되며 학교 또는 커뮤니티 데이터를 수정하는 기능을 제공하지 않습니다.

사용자가 주의해야 할 사항

  • 신뢰할 수 있는 저장소 또는 신뢰할 수 있는 배포 페이지에서만 설치하고 가능한 한 소스 코드와 배포 해시를 확인하세요.

  • 로컬 인증 페이지 주소는 http://127.0.0.1:<임의 포트>/connect로 시작해야 합니다.

  • Agent 채팅창, MCP 매개변수, Issue 또는 로그에 비밀번호, 인증 코드, Cookie, token 또는 러쉐 URL을 절대 보내지 마세요.

  • 신뢰할 수 없는 공용 컴퓨터에서 개인 학교 계정을 사용하지 마세요.

  • 러쉐 구독 URL은 "얻으면 읽을 수 있는" 개인 링크이므로 비밀번호처럼 보호해야 합니다. 유출이 의심되면 러쉐에서 다시 생성하세요.

  • 성적, 시간표 조회 시 해당 데이터가 현재 Agent에 제공됩니다. 사용 중인 모델과 클라이언트의 데이터 정책에 따라 활성화 여부를 직접 판단하세요.

로컬 세션 삭제

Windows에서 제어판 → 자격 증명 관리자 → Windows 자격 증명을 열고, Linux에서는 현재 데스크톱 환경에서 사용하는 Secret Service 관리 도구(일반적으로 GNOME Keyring 또는 KDE Wallet)를 엽니다. 서비스 이름이 bit101-mcp인 다음 항목을 삭제하세요:

  • bit101-session

  • school-session

  • lexue-calendar-url

삭제 후 다음에 해당 도구를 호출하면 다시 인증합니다. Python 패키지를 제거해도 이러한 시스템 자격 증명은 자동으로 삭제되지 않습니다. Linux에 사용 가능한 keyring 백엔드가 없으면 세션은 현재 프로세스 메모리에만 저장되며 MCP를 재시작하면 다시 로그인해야 합니다.

구성 항목

비밀 매개변수는 환경 변수로만 구성할 수 있습니다:

변수

기본값

용도

BIT101_API_URL

https://bit101.flwfdd.xyz

BIT101 API 루트 주소

BIT101_SCHOOL_API_URL

https://login.bit101.flwfdd.xyz

BIT-Login REST 루트 주소

BIT101_REQUEST_TIMEOUT

30

단일 상위 서비스 HTTP 타임아웃(초)

BIT101_AUTH_TIMEOUT

300

로컬 인증 페이지 최대 대기 시간(초)

자격 증명과 세션은 도구 매개변수나 환경 변수로 구성할 수 없습니다. 상위 서비스 주소를 변경하는 것은 새로운 서비스 운영 주체를 신뢰한다는 의미이므로 주의해서 사용하세요.

자주 묻는 질문

프로젝트 디렉터리에서 Agent를 시작해야 하나요?

아닙니다. uv tool install .로 명령을 설치하고 MCP를 클라이언트의 사용자 수준 구성에 작성하면 모든 디렉터리에서 사용할 수 있습니다. 프로젝트 루트의 opencode.json, .cursor/mcp.json 또는 .codex/config.toml은 해당 프로젝트에만 적용됩니다.

왜 처음 사용할 때 브라우저가 열리나요?

인증은 필요 시 트리거됩니다. 첫 번째 게시물 조회에는 BIT101 세션이 필요하고, 첫 번째 시간표/성적 조회에는 학교 세션이 필요하며, 첫 번째 러쉐 조회에는 개인 캘린더 구독도 필요합니다. 비밀번호와 구독 주소는 채팅을 거칠 수 없으므로 임시 로컬 페이지로 수집합니다.

BIT101 웹페이지에 이미 로그인했는데 MCP가 여전히 로그인을 요구하는 이유는?

웹 세션은 브라우저 Cookie에 저장됩니다. MCP는 브라우저 Cookie를 읽지 않으므로 자체 최소 세션을 구축해야 합니다. 이로 인해 최초 로그인 편의성이 한 번 희생되지만 브라우저의 모든 로그인 데이터에 직접 접근하는 것을 피할 수 있습니다.

새 대화에서 가끔 다시 로그인해야 하는 이유는?

새 대화는 세션을 적극적으로 지우지 않지만 MCP는 상위 서비스 세션을 검증합니다. 세션 만료, 서버에 의한 취소, 인증 게이트웨이 챌린지 무효화 또는 시스템 자격 증명 저장소를 사용할 수 없는 경우 다시 로그인합니다. 방금 로그인에 성공하고 즉시 재시작했는데 다시 요구되면 시스템 자격 증명 저장소에 bit101-mcp 항목이 있는지 확인하세요.

러쉐가 Connected를 표시하는데 작업이 없는 이유는?

구독 주소가 iCalendar 검증을 통과했다면 빈 목록은 일반적으로 선택한 시간 범위에 실제로 이벤트가 없다는 뜻입니다. 조회 범위를 7일에서 30일로 확대하여 확인할 수 있습니다.

학교 도구가 느려 보이는 이유는?

최초 학교 인증, SMS 인증 및 성적 상세 조회는 시간이 오래 걸릴 수 있습니다. MCP 도구 타임아웃을 360초로 설정하고 현재 호출이 완료될 때까지 기다리세요. 여러 학교 도구를 동시에 재시도하지 마세요.

bit101-mcp 명령을 찾을 수 없으면 어떻게 하나요?

uv tool dir --bin을 실행하여 설치 디렉터리를 찾고 PATH에 추가하거나 MCP 구성에 bit101-mcp.exe의 절대 경로를 직접 입력하세요. 수정 후 클라이언트를 재시작하세요.

오류 코드

코드

의미

BIT101_AUTH_REQUIRED

BIT101 세션 구축 필요

SCHOOL_AUTH_REQUIRED

학교 세션 구축 필요

AUTH_EXPIRED

저장된 세션 만료

AUTH_FAILED

로그인 실패 또는 자격 증명이 상위 서비스에 수락되지 않음

AUTH_TIMEOUT

로컬 인증 페이지 대기 타임아웃

LEXUE_SETUP_REQUIRED

러쉐 구독이 없거나, 무효이거나, 유효한 캘린더가 아님

NOT_FOUND

지정 게시물 등 레코드가 없음

UPSTREAM_UNAVAILABLE

상위 서비스가 일시적으로 사용 불가, 나중에 재시도 가능

INVALID_RESPONSE

상위 서비스가 인식할 수 없는 데이터 반환

모든 오류는 정제를 거치며 비밀번호, Cookie, token, Authorization 헤더, 원본 스택 또는 전체 민감 요청을 반환하지 않습니다.

개발

프로젝트 구조:

src/bit101_mcp/
├── server.py           # MCP 入口、工具注册和服务器说明
├── tools/              # Agent 可见的只读工具
├── clients/            # BIT101 与学校上游客户端
├── auth/               # 本地浏览器认证、状态机和凭据存储
├── models/             # 数据标准化、周次和 ICS 解析
└── logging_utils.py    # stderr 日志和秘密脱敏

개발 의존성 설치 및 검사 실행:

uv sync --all-groups
uv run ruff check .
uv run ruff format --check .
uv build

유지관리자는 배포 전에 공개 저장소에 포함되지 않는 모의 테스트로 데이터 표준화, 인증 상태, 비밀 정보 마스킹 및 재시도 프로세스를 검증합니다. 이러한 테스트는 실제 계정이 필요하지 않습니다. 실제 계정 통합 테스트는 수동, 선택 사항으로 유지하며 테스트 자격 증명을 저장소나 CI에 커밋해서는 안 됩니다.

감사의 말

BIT101 프로젝트와 모든 기여자에게 감사드립니다. 선배들이 오랫동안 유지 관리해 온 커뮤니티, 강의 평가, 캠퍼스 데이터 인터페이스 및 인증 도구는 학생들의 캠퍼스 생활에 큰 편의를 제공했으며 이 프로젝트의 중요한 기반이 되었습니다.

이 프로젝트는 특히 다음 프로젝트가 제공하는 인터페이스와 문서를 참조하거나 사용했습니다:

BIT101 MCP는 독립적으로 개발된 비공식 MCP 클라이언트로, 네트워크 인터페이스를 통해 관련 서비스와 상호작용합니다. 이 저장소의 MIT License는 이 프로젝트의 원본 코드에만 적용되며 어떤 상위 프로젝트의 라이선스도 대체하거나 변경하지 않습니다.

현재 제한 사항

  • Windows에서 주요 프로세스 실기 테스트를 완료했습니다. Fedora 43 + niri에서 실행 가능함을 확인했으며 다른 Linux 데스크톱 환경은 아직 하나씩 검증하지 않았습니다.

  • 러쉐는 여전히 내보낸 개인 캘린더 구독 주소를 한 번 수동으로 붙여넣어야 합니다.

  • 학교 세션의 유효 기간은 상위 게이트웨이가 결정하므로 장기간 무로그인을 보장할 수 없습니다.

  • 성적 평균 및 최고점은 상위 서비스가 각 과목의 상세 정보를 제공하는지에 따라 달라집니다.

  • 아직 PyPI 패키지와 Windows 독립 실행 파일을 게시하지 않았습니다.

  • 쓰기 작업을 제공하지 않습니다.

라이선스

本项目采用 MIT License。欢迎在保留版权与许可声明的前提下使用、修改、分发和提交改进。

贡献

欢迎提交 Issue 和 Pull Request。报告问题时请提供:

  • 操作系统、Python、uv 和 MCP 客户端版本

  • 使用的工具名称与经过脱敏的错误代码

  • 是否出现本地认证页面

  • 可复现步骤

请勿提交学号、密码、验证码、Cookie、token、完整请求头、乐学 URL 或其他个人信息。

Available Tools

10 tools
get_course_reviewsGet BIT101 course reviewsB
Read-only

Aggregate course metadata, teachers, reviews, and historical score data.

NameRequiredDescriptionDefault
course_idYesBIT101 course ID.
comment_pagesNoNumber of review pages to aggregate.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context that this is an aggregating read operation pulling several data categories, but it does not disclose details such as pagination behavior, rate limits, or the reach of 'historical score data'.

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?

A single compact sentence front-loads the action and lists the key result categories with no filler or redundancy. Every word contributes to understanding what the tool returns.

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 read-only annotations, a full output schema, and fully documented parameters, the description is largely sufficient for an agent to invoke the tool correctly. The main gap is the lack of guidance for choosing this tool over sibling tools, though that is more a usage-rule concern than a completeness 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 description coverage is 100%, so both course_id and comment_pages are already well documented with types, defaults, and bounds. The description adds no additional parameter-specific meaning, so it meets the baseline without exceeding it.

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 uses a specific verb ('aggregate') and enumerates the returned resources ('course metadata, teachers, reviews, and historical score data'), making the tool's focus clear. It does not explicitly contrast with siblings like search_courses or get_scores, but the resource description is sufficiently unambiguous.

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?

No guidance is provided about when to use this tool versus sibling tools such as search_courses, get_post, or get_scores. The description only states what it aggregates, leaving the agent to infer appropriate usage from the tool name and title.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_postGet a BIT101 postA
Read-only

Return one BIT101 post by ID.

NameRequiredDescriptionDefault
post_idYesBIT101 post ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as readOnlyHint=true, covering the safety profile. The description adds minimal behavioral detail beyond this, but for a simple single-ID read operation, the core behavior is adequately conveyed. No hidden side effects or contradictions are present.

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?

The description is a single, front-loaded sentence with no filler. It communicates the action, the resource, and the selection criterion efficiently.

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 simple get-by-ID tool, the description, input schema, output schema, and annotations provide everything an agent needs to invoke it correctly. No additional context about return values or safety is necessary.

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?

The schema fully documents post_id with its own description, so schema coverage is 100%. The description adds no additional parameter semantics beyond what the schema already provides, fitting the baseline of 3.

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 uses a specific verb ('Return') and a specific resource ('one BIT101 post') with a precise selection mechanism ('by ID'). This clearly distinguishes it from sibling list/search tools and leaves no ambiguity about scope.

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 description implies the proper usage: call this tool when you have a specific post_id and need exactly one post. However, it does not explicitly state when to use this tool instead of list_today_posts or search_posts, nor does it mention alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_scheduleGet BIT scheduleA
Read-only

Whole term only; for relative weeks use get_week_schedule; browser: do not retry.

NameRequiredDescriptionDefault
termNoOptional term code such as 2025-2026-1.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, covering safety and world-openness. The description adds the non-obvious behavioral constraint 'Whole term only' and the retry guidance, which go beyond the structured metadata. No contradiction with annotations exists.

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?

The description is three short clauses, each carrying distinct functional or operational information. It is front-loaded with the core scope ('Whole term only') and has no filler or 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?

Given the single optional parameter, full schema coverage, an output schema, and annotations covering safety, the description provides the remaining necessary context: scope, sibling routing, and a retry caveat. Nothing essential is missing for correct tool selection and invocation.

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?

The input schema fully describes the single optional 'term' parameter, including its format, default, and example. The description does not add parameter-level detail, but with 100% schema coverage the baseline of 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 title 'Get BIT schedule' and description 'Whole term only' make it clear the tool retrieves a schedule for a full term, distinguishing it from week-based schedule tools. It lacks an explicit verb in the description, but the name and title supply the action and resource.

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?

The description explicitly states when to use this tool ('Whole term only') and directs users to a specific alternative ('for relative weeks use get_week_schedule'). It also adds the operational warning 'browser: do not retry', which is useful guidance for invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_scoresGet BIT gradesA
Read-only

Return grades with class average/maximum when available; browser: do not retry.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, covering the safety profile. The description adds useful context with 'when available' and the operational note 'browser: do not retry,' but the browser note is terse and does not explain failure or retry semantics in 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?

The description is a single front-loaded sentence that states the core behavior first. The 'browser: do not retry' clause is terse but adds an operational constraint without unnecessary words.

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 no-parameter, read-only tool with an output schema, the description is nearly complete: it states what is returned and that class average/maximum may not always be present. The ambiguous 'browser: do not retry' note prevents a perfect completeness score.

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?

The input schema has zero parameters and schema description coverage is 100%, so there is no parameter information the description needs to add. The 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?

The description uses a specific verb and resource: 'Return grades' with an added detail about class average/maximum. This clearly identifies the tool's purpose and distinguishes it from the schedule, course, and post-related sibling tools.

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 explicit guidance about when to use this tool versus alternatives, and no prerequisites or exclusions are stated. The name implies the use case, but the description does not actively help an agent decide between tool options.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_today_scheduleGet today's BIT scheduleA
Read-only

Return today's classes. May open a browser for school login; wait, do not retry.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds a concrete behavioral warning beyond the annotations: it may open a browser for school login, and the agent should wait and not retry. This is valuable context that readOnlyHint/openWorldHint do not fully convey. The instruction 'wait, do not retry' is slightly ambiguous, preventing 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The core purpose is front-loaded, and the critical runtime warning follows immediately. Every word earns its place.

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?

Given there are no parameters, an output schema exists, and annotations already cover read-only and open-world behavior, the description is complete for selecting and invoking the tool. The only behavioral nuance an agent needs—possible browser opening and no retry—is explicitly stated.

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?

The tool has zero parameters and the schema covers 100% of them, so there are no parameter semantics the description needs to explain. The baseline of 4 for a zero-parameter tool 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?

The description states a specific verb ('Return') and a precise resource ('today's classes'), making the tool's scope immediately clear. It also naturally distinguishes this tool from siblings like get_week_schedule and get_schedule by anchoring on 'today's'.

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 description implies this tool is for retrieving today's classes, but it never explicitly states when to use it versus alternatives such as get_week_schedule or get_schedule. The browser/login warning is behavioral guidance, not usage selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_upcoming_lexue_tasksGet upcoming Lexue tasksA
Read-only

Return Lexue events; invalid subscriptions reopen browser setup; do not retry.

NameRequiredDescriptionDefault
daysNoFuture time window in days.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint and openWorldHint annotations already present, the description still adds value by warning that invalid subscriptions can reopen browser setup and instructing not to retry. This exposes an important side effect beyond the standard 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?

The description is one compact, front-loaded sentence: purpose first, then the critical retry warning. Every phrase earns its place with no filler.

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 single-parameter read-mostly tool with an output schema, the description covers the core action and the critical failure behavior. It could be more complete by explicitly saying the result is a list of upcoming Lexue tasks, but the name, title, and days parameter fill that 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?

The schema already documents the only parameter, days, with a clear description ('Future time window in days'), so schema description coverage is 100%. The prose description adds no parameter-level detail, matching the baseline of 3.

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 concrete action ('Return Lexue events') and the tool name/title specify 'upcoming Lexue tasks', which separates it from the post/course/schedule siblings. It is slightly vague because the description says 'events' rather than 'tasks' and does not explicitly mention the upcoming time window beyond the days parameter.

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?

The description gives no when-to-use guidance or comparison with sibling tools like get_today_schedule or list_today_posts. The only usage-related note is 'do not retry', which is a retry prohibition rather than guidance for selecting this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_week_scheduleGet this or a relative week's BIT scheduleA
Read-only

Call for this/next/last week. Exact dates/times; browser may open; do not retry.

NameRequiredDescriptionDefault
week_offsetNoWeek relative to current: 0=this, 1=next, -1=last.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond annotations: 'browser may open' and 'do not retry'. Nothing contradicts 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences carry purpose, output character, a side-effect warning, and a retry instruction with no filler. The most important routing information is front-loaded.

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 single optional parameter, an output schema, and read-only/open-world annotations, the description covers what to call, what kind of output to expect, and the notable side effect. Nothing essential for correct invocation 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 description coverage is 100%, so week_offset is fully documented with its default, range, and meaning. The description only paraphrases this/next/last week and adds no parameter-specific details, 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (a relative week's BIT schedule) and the action (get/call for this/next/last week), so an agent can tell what the tool does. It does not explicitly contrast with siblings like get_today_schedule or get_schedule, so it stops short of full differentiation.

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?

'Call for this/next/last week' provides a clear target use case, and 'do not retry' gives explicit invocation guidance. It lacks exclusions or named alternatives, such as pointing to get_today_schedule for today-only schedules, so it is not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_today_postsList today's BIT101 postsA
Read-only

Return BIT101 posts created today in Asia/Shanghai time.

NameRequiredDescriptionDefault
limitNoMaximum posts to return.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this by saying 'Return'. It adds valuable context about the Asia/Shanghai timezone determining the day boundary. No contradictory or misleading behavior is stated, and the description does not claim anything beyond what the tool does.

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?

The description is a single clear sentence that front-loads the purpose, resource, and timezone. Every word is necessary and there is no extraneous 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 simple read-only list operation with zero required parameters and an output schema present, the description fully covers the essential contextual detail: the resource, the time scope, and the timezone boundary. Nothing critical for invoking this tool 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 description coverage is 100%, and the only parameter 'limit' is fully documented in the schema as 'Maximum posts to return' with defaults and bounds. The description does not add additional parameter behavior beyond what the schema already provides, so the baseline score 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?

The description states a specific verb ('Return'), a clear resource ('BIT101 posts'), and an unambiguous scope ('created today in Asia/Shanghai time'). It distinguishes itself from siblings like search_posts and get_post by focusing on today's posts. The addition of the timezone disambiguates the meaning of 'today'.

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?

The description clearly communicates that this tool returns today's BIT101 posts, implying it is the choice when the agent needs a list of posts from the current day in Asia/Shanghai time. It does not explicitly name alternatives or exclusion conditions, but the context is clear enough relative to siblings such as search_posts and get_post.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_coursesSearch BIT101 coursesB
Read-only

Search BIT101 course and teacher records.

NameRequiredDescriptionDefault
pageNoZero-based result page.
limitNoMaximum courses to return.
orderNorate
queryYesCourse or teacher search text.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description is not burdened with explaining safety behavior. It adds some scope context (courses and teacher records) but does not disclose additional behavioral traits such as matching behavior or ordering semantics.

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?

The description is a single efficient sentence with no filler. It is front-loaded with the verb and target resource and earns its place.

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?

Given the output schema, annotations, and parameter descriptions, the definition is largely complete for a search operation. The only notable gap is the absence of any usage guidance relative to sibling tools, but this does not prevent an agent from invoking the tool 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 75%: query, page, and limit have descriptions, and order has an enum. The description adds little beyond what the schema already says, though it does reinforce that queries can target both course and teacher records.

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 clear verb and resource: 'Search BIT101 course and teacher records.' This identifies the tool's scope and distinguishes it from siblings like search_posts, though it does not explicitly contrast itself with 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 Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as search_posts or get_course_reviews. The resource scope is implied by the description, but no when-to-use or when-not-to-use context is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_postsSearch BIT101 postsA
Read-only

Search public BIT101 discussion posts.

NameRequiredDescriptionDefault
pageNoZero-based result page.
limitNoMaximum posts to return.
queryYesSearch text.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, covering the operation's safety and dynamic nature. The description adds the 'public' scope and 'discussion posts' resource, which is useful context, but does not disclose additional behavioral details such as pagination behavior, result ordering, or real-time semantics beyond what annotations and schema already provide.

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?

The description is a single, front-loaded sentence with no wasted words. It conveys the essential purpose immediately and does not repeat information already available in the schema or annotations.

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 simple search tool with three well-documented parameters, readOnly/openWorld annotations, and an output schema, the description is sufficient. An agent can correctly understand the tool's purpose and invoke it without needing additional context.

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?

The input schema provides complete descriptions for all three parameters (query, page, limit), so the description does not need to compensate. The description itself adds no parameter-level meaning, but with 100% schema coverage the baseline score 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?

The description clearly states the specific verb 'Search' and the resource 'public BIT101 discussion posts,' making the tool's purpose immediately evident. It distinguishes itself from sibling tools like list_today_posts and get_post by emphasizing search over listing or retrieval.

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 description implies this tool is for searching public posts by keyword, but it does not explicitly state when to use it instead of alternatives like list_today_posts or get_post. There is no exclusionary guidance or mention of alternatives, so the agent must infer usage from the name and description.

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. 10 tool updatesv0.1.0
    • First observedget_course_reviews
    • First observedget_post
    • First observedget_schedule
    • First observedget_scores
    • First observedget_today_schedule
    • First observedget_upcoming_lexue_tasks
    • First observedget_week_schedule
    • First observedlist_today_posts
    • First observedsearch_courses
    • First observedsearch_posts

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

Each tool maps to a distinct resource or time range, and the schedule tools are explicitly qualified as today, week, or whole term. The only mild overlap is between search_courses and get_course_reviews, but the descriptions help differentiate them.

Naming Consistency5/5

Tool names consistently use a verb prefix (get, list, or search) followed by a lowercase snake_case noun phrase, such as get_course_reviews and list_today_posts. There is no mixed casing or inconsistent verb style.

Tool Count5/5

Ten tools cover the main BIT101 areas—posts, courses, schedules, grades, and tasks—without feeling bloated. The additional schedule and post tools each serve a specific retrieval need, so the count is well-scoped.

Completeness4/5

The read-only surface is fairly complete for posts, courses, schedules, scores, and Lexue tasks. Minor gaps exist, such as arbitrary future-date schedule lookup and any write/submit endpoints, but these are likely outside scope and workarounds are available.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides read-only access to Canvas LMS, enabling users to view active courses, grades, and upcoming assignments through natural language queries.
    2
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only queries of i桂航 campus data, including schedules, classes, terms, and campus information through MCP tools.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to read courses, upcoming deadlines, assignment details, grades, announcements, modules, files, inbox, and timetable from U of T Quercus and ACORN through read-only tools.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to read a student's own university academic data — class timetables, exam schedules, grades, available terms, and empty classrooms — from Qiangzhi (jsxsd) or Zhengfang V9 systems via a session imported from the browser. All access is strictly read-only, never performing course selection, withdrawal, or evaluations.
    6
    1
    MIT