Sciencetokyolms Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Sciencetokyolms Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
東京科学大学 (Science Tokyo) の LMS を操作する MCP (Model Context Protocol) サーバです. 講義資料のダウンロードや課題締切の確認などを,MCP クライアント (Claude 等) から ツールとして呼び出せるようにします.
[!NOTE] 導入して使い始めたいだけの方 (研究室メンバー向け) は docs/USAGE.md を参照してください. 本 README はおもに方針・内部構成・開発手順をまとめたものです.[!WARNING] 本ツールは 個人の学修利用 を前提とします.大学システムへの自動アクセスは 利用規約に抵触する場合があります.利用前に Science Tokyo の規約を確認し, アクセス頻度を抑える (キャッシュ・低頻度アクセス) など節度ある運用をしてください.
https://lms.s.isct.ac.jp/<年度>/)/2025/).ブラウザ巡回 (スクレイピング) ではなく公式 API を用いるため安定・高速.
client/moodle_client.py) は実装済みですが,**実トークンでの動作確認は未実施**です (下記 science-tokyo-lms-login で取得後に検証してください).
Science Tokyo は SAML2 SSO (isct.ex-tic.com / MFA 必須) で保護されています. そのためパスワードによるトークン発行は使えません.代わりに Moodle モバイルアプリと 同じ launch フローを用います.
# 初回のみ: ブラウザが開くので SSO ログイン (MFA 含む) を完了する
# → モバイルトークンを取得し keyring に保存する
uv run science-tokyo-lms-login取得したトークンは keyring (利用不可なら .auth/wstoken,いずれも .gitignore 済み) に 保存され,以降はブラウザ不要で Web Services API を呼び出します.
トークンが失効すると,MCP サーバは API 呼び出し中にそれを検知し,ヘッドレスブラウザで 自動的に再ログインして元の操作をリトライします.永続プロファイル (.auth/profile/) の SSO セッションが生きていれば,ユーザー操作なしに復旧します.SSO セッションも切れていて MFA の再入力が必要な場合のみ自動再ログインは失敗し,uv run science-tokyo-lms-login の 実行を促すエラーを返すので,手動で上記コマンドを実行してください.
サーバが自動再ログインする際は永続プロファイルを一時的に占有します.MCP サーバ稼働中に 別途 `science-tokyo-lms-login` を実行しないでください (同一プロファイルを 2 プロセスで 同時に開けません).自動再ログインを無効化したい場合は STLMS_AUTO_RELOGIN=false を設定します.uv sync # 依存関係の同期
uv run playwright install chromium # 使用するブラウザを取得 (chromium / firefox / webkit)
cp .env.example .env # 必要に応じて編集 (年度・ブラウザ等).env)主な設定項目 (環境変数 STLMS_*,.env で指定可).
| 変数 | 既定 | 説明 |
|---|---|---|
STLMS_LMS_BASE_URL | .../2025/ | Moodle のベース URL (年度ごとにパスが変わる) |
STLMS_BROWSER | chromium | トークン取得に使うブラウザ (chromium / firefox / webkit) |
STLMS_TOKEN_BACKEND | auto | トークン保存方式 (auto / keyring / file) |
STLMS_WSTOKEN | (なし) | トークンを直接指定する場合 (最優先) |
STLMS_AUTO_RELOGIN | true | トークン失効時にヘッドレスで自動再ログインするか |
keyring (パスワードストア) が使えない環境ではSTLMS_TOKEN_BACKEND=fileを指定すると, トークンを.auth/wstoken(.gitignore 済み,パーミッション 0600) に保存します.
uv run science-tokyo-lms-mcp # MCP サーバを stdio で起動MCP クライアント (例: Claude Desktop / Claude Code) には以下のように登録します.
{
"mcpServers": {
"science-tokyo-lms": {
"command": "uv",
"args": ["run", "--directory", "/path/to/ScienceTokyoLMS-mcp", "science-tokyo-lms-mcp"]
}
}
}| ツール | 説明 |
|---|---|
list_courses | 履修中コースの一覧 |
list_materials(course_id) | 講義資料の一覧 |
download_material(course_id, material_id, dest_dir?) | 講義資料のダウンロード |
list_assignments(course_id?) | 課題と締切の一覧 |
get_upcoming_deadlines(days=7) | 直近の課題を締切順に取得 |
list_announcements(course_id?) | お知らせ・休講情報 (アナウンス) の一覧 |
submit_assignment_files(assignment_id, file_paths, confirm=False) | 課題へのファイル提出 (2 段階: 既定はプレビュー) |
課題の提出済み判定は別 API が必要なため,現状submittedは常にfalseです (今後mod_assign_get_submission_statusで対応予定).
submit_assignment_files)提出は 2 段階 で行います.いきなり提出せず,途中で内容を確認する工程を挟みます.
confirm=False (既定) で呼ぶと,Moodle へは一切書き込まず,課題の説明文・提出制約 (許可拡張子・最大サイズ・最大数・下書き要否) と,各ファイルのローカル 検査結果 (存在・拡張子・サイズ) を返します.
confirm=True で同じ引数を渡して再度呼ぶと,実際に提出します.提出は webservice/upload.php でドラフト領域へアップロードし,mod_assign_save_submission で添付,下書き方式の課題では mod_assign_submit_for_grading で採点提出まで確定します.
注意 - 拡張子が許可リストと明確に異なるファイルはconfirm=Trueでも提出を中止します. ただし Moodle のタイプグループ (document等) は近似判定のため,警告に留めます. - 採点提出は取り消せない場合があります.まずはテスト用課題で試すことを推奨します. - 提出規約のある課題ではacceptsubmissionstatement=1(同意) として送信します.confirm=Trueの実行をもって同意とみなす点に留意してください.
| ツール | Web Services 関数 |
|---|---|
list_courses | core_webservice_get_site_info + core_enrol_get_users_courses |
list_materials | core_course_get_contents |
list_assignments | mod_assign_get_assignments |
list_announcements | mod_forum_get_forums_by_courses + mod_forum_get_forum_discussions |
submit_assignment_files | webservice/upload.php + mod_assign_save_submission (+ mod_assign_submit_for_grading) |
src/science_tokyo_lms_mcp/
├── server.py # FastMCP サーバ (エントリポイント)
├── login.py # 初回トークン取得 CLI
├── config.py # 設定 (環境変数 STLMS_*)
├── models.py # データモデル
├── auth/
│ ├── session.py # Playwright 永続セッション管理
│ └── token.py # モバイルトークンの取得・保管 (keyring)
├── client/
│ ├── base.py # LMSClient プロトコル
│ ├── moodle_client.py # Moodle Web Services 実装 (既定)
│ └── playwright_client.py # スクレイピング方式のフォールバック
└── tools/ # MCP ツール (courses / materials / deadlines / announcements / submissions)uv run ruff format . # フォーマット
uv run ruff check . # Lint
uv run ty check # 型チェック
uv run pytest # テスト.gitignore 済み).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.