Skip to main content
Glama

utol-mcp

東京大学の学習管理システム UTOL (UTokyo LMS) を、MCP クライアント(Claude Desktop など)から 扱えるようにする個人用の MCP サーバーです。受講登録済みの講義・締切・お知らせ・教材・課題などを 自然言語で参照できます。

ローカル実行を前提とし、機能は読み取りが中心です。認証はユーザー本人が公式の UTokyo Account ログイン画面で行い、ツールはパスワードや MFA コードを扱いません。

できること

  • 受講登録済みの講義(時間割)・お知らせ・教材リンクの一覧

  • 全科目を横断した課題・テストの締切一覧、課題詳細の参照

  • シラバス(UTAS)の参照、受講登録外コースの検索(公開カタログ情報のみ)

  • 教材ファイルの個別ダウンロード

  • 課題の「提出不要」切替、コースの受講登録・解除(確認付きの書き込み操作)

Related MCP server: ScienceTokyoLMS-mcp

セットアップ

1. インストールとログイン

配布状態について 本パッケージは調査時点で npm に未公開です。以下の npx -y utol-mcp ... は npm 公開を想定した手順であり、 公開までは後述の「開発」節のローカルビルド手順(node dist/index.js ...)を利用してください。 なお npm 公開時は、AGPL-3.0 依存(mupdf)に関する後述の注意(ライセンス)を満たす必要があります。

npx で実行する場合は次のとおりです。

npx -y utol-mcp login

ブラウザが開くので、UTokyo Account でログインしてください。ログインが確認されると、以降の実行で 再認証が不要になります(セッションは ~/.utol-mcp/ に保存されます)。

状態確認・ログアウト

npx -y utol-mcp auth-status   # ログイン済みか確認
npx -y utol-mcp logout        # セッションとキャッシュを削除

2. MCP クライアントに登録

Claude Desktop などの設定ファイルに次を追加します。

{
  "mcpServers": {
    "utol": { "command": "npx", "args": ["-y", "utol-mcp", "serve"] }
  }
}

登録後、クライアントから「今週の課題の締切は?」「〇〇の講義のお知らせを見せて」のように 自然言語で問い合わせできます。

提供ツール

読み取り中心のツールです。

ツール

説明

主な引数

auth_status

ログイン状態の確認

—

list_courses

受講登録している講義(時間割)一覧

refresh?

get_course

講義詳細(お知らせ・教材・課題)

idnumber

list_assignments

全科目横断の課題・テスト一覧と締切

refresh?

get_assignment

課題詳細(読み取りのみ)

idnumber, url

get_syllabus

シラバス(UTAS 参照)

idnumber, syllabusUrl?

search_courses

コース検索(受講登録外可・公開カタログ情報のみ)

keyword?, teacher?, year?

get_material

教材内容を読む(LLM コンテキストへ取り込む)

idnumber, resourceId, mode?

download_material

教材ファイルをローカルへダウンロード

idnumber, resourceId, destPath?

list_messages

メッセージ一覧(メタのみ・本文なし)

refresh?

refresh_cache

主要一覧の再取得

—

  • get_course / get_assignment / get_material / download_material は、受講登録中のコースのみ対象です。

  • get_material / download_material の対象は get_course が返す materials[].resourceId で指定します。

  • get_material は内容を読む用途(mode は text=テキスト抽出/image=ページ画像化)。抽出非対応形式は download_material を使ってください。

  • download_material はファイルとして残す用途です。stdio 接続ではサーバーローカルのディスクへ保存(destPath 省略時は ~/.utol-mcp/downloads/)、HTTP 接続では取得用の一時 URL(短TTL・単回使用)を返し、curl で保存します。

  • 受講登録外コースは search_courses が返す公開カタログ情報とシラバスのみを参照できます。

書き込み操作

状態を変更する操作です。confirm:true が無い場合は実行せずプレビューのみを返し、実行時は ~/.utol-mcp/audit.log に記録が残ります。特に unregister_course は受講登録・提出物に影響します。

ツール

説明

可逆性

set_task_no_submission

課題を「提出不要」⇔「未提出」に切替

可逆

register_course

コースを受講登録

解除可能

unregister_course

受講登録を解除

要注意(データ喪失の可能性)

ポリシー

  • 個人の学習支援を目的とし、大量アクセスや教材収集には用いません。

  • UTokyo SSO・MFA・CAPTCHA・アクセス制御・レート制限を回避しません。

  • 認証はユーザー本人が正規ログイン画面で行い、ツールは資格情報を収集・保存・入力しません。

  • 受講登録外コースは公開カタログ情報とシラバスのみを取得し、保護された内部コンテンツは取得しません。

  • セッション情報は機密情報として ~/.utol-mcp/(ディレクトリ権限 700)に保存します。Git・ログ・クラウドには含めないでください。

  • 利用者は大学の規則、UTOL の利用規程、関連法令を守る必要があります。UTOL・大学の利用規程が自動アクセス(スクレイピング)・認証セッションの保存・教材の外部サービス送信・受講登録操作の自動化を許容するかは、利用者自身が原文で確認してください。 禁止されている場合、本ツールの利用は学内処分・契約上の責任の対象となり得ます。

  • 本ツールは無保証で提供されます。利用に伴う損害や不利益について、開発者は一切の責任を負いません。利用者自身の責任で使用してください。

秘密情報の取り扱い(HTTP モード)

  • HTTP モードのパスフレーズ・OAuth トークン、およびローカルの UTOL セッションは、いずれも第三者に共有・エクスポートしないでください。これらが漏えいすると、保存済みの UTOL セッションを介してあなたのアカウントでの代理アクセスが可能になります。

  • UTokyo Account の共有は大学の利用規則に抵触し得ます。本ツールは単一利用者(本人)による利用を前提とし、他人にアクセスさせる第三者向けサービス提供は想定していません。

教材内容の外部 LLM への送信について

  • get_material は教材内容を MCP クライアント(クラウド LLM を含み得る)のコンテキストへ取り込みます。この送信が著作権法上の私的使用(30 条)や非享受利用(30 条の 4)で正当化されるかは不確実です。

  • 教材に複製・アップロード禁止等の個別指示がある場合や、送信先 LLM 事業者の規約・学習利用設定によっては問題が生じ得ます。授業ごとの指示・教材の利用条件・送信先の保存/学習利用設定を確認し、送信は必要最小限にとどめてください。機微な教材については、ローカルモデルまたは学内で承認されたサービスの利用を優先してください。

詳細は docs/AUTHENTICATION_POLICY.md を参照してください。

認証の仕組み

UTOL のアプリセッションはブラウザ終了時に失われますが、utol-mcp login で確立した UTokyo Account (Microsoft SSO)の永続セッションが端末に残るため、以降のツール実行時は資格情報・MFA なしの リダイレクトのみでセッションが再確立されます。再認証の途中で資格情報・MFA・アカウント選択が 要求された場合は直ちに中止し、手動ログインを促します。詳細は docs/AUTHENTICATION_POLICY.md を参照してください。

開発

TypeScript 製です。npm install 時の prepare スクリプトで dist/ へ自動ビルドされるため、 npx でも動作します。ローカルで開発する場合は次のとおりです。

npm install        # 依存 + Chromium 取得 + 自動ビルド
npm run build      # 変更を反映する際に再ビルド
npm test           # パーサ・日時正規化の単体テスト
npm run typecheck

node dist/index.js login   # ローカルビルドでの実行例

MCP クライアントにローカルビルドを登録する場合は、serve を次のように指定します。

{ "command": "node", "args": ["/absolute/path/to/utol-mcp/dist/index.js", "serve"] }

実 UTOL に対する主要フロー(ログイン・認証再確立・時間割/課題/講義/シラバス/検索/教材DL)は 実機で検証済みです。test/fixtures/raw/(.gitignore 済み)に実 HTML を保存してパーサの セレクタを確定しています。UTOL 側の画面改修時は、同ディレクトリの HTML を更新して パーサを再確認してください。

ライセンス

本プロジェクトの自作ソースコードは MIT です。

ただし、依存パッケージのうち mupdf(MuPDF, Artifex Software)は AGPL-3.0-or-later です。本プロジェクトは PDF 処理のため mupdf を直接 import しているため、mupdf と結合した状態で配布・ネットワーク提供する場合、結合著作物全体に AGPL の条件(ソース提供義務、ネットワーク利用条項=AGPL 第 13 条を含む)が及ぶと評価される可能性があります。MIT の許諾は自作コードにのみ及び、AGPL 依存の義務を打ち消すものではありません。

  • npm 等への実行可能パッケージの配布、または 第三者へのネットワーク提供を行う場合は、結合著作物としての AGPL 適合(通知・対応ソースの提供・第 13 条への対応)を個別に確認するか、mupdf を互換ライセンスのライブラリ(例: pdfjs-dist, Apache-2.0)へ置換するか、Artifex から別途商用ライセンスを取得してください。

  • AGPL の条件は、個人利用・非商用利用であっても免除されません。

詳細は LICENSE の「Third-party licenses」節を参照してください。

Available Tools

15 tools
auth_statusA

UTOL にログイン済みかを確認する。未ログインなら手動ログインを案内する(自動ログインはしない)。

Inputs: no named parameters.

download_materialA

教材ファイルを単一・オンデマンドでローカルへ保存する。大量DL不可。受講登録済みコースのみ。get_course の materials[].resourceId で対象教材を指定する。

Inputs: destPath (required), idnumber (required), resourceId (required).

get_assignmentA

課題の詳細(説明・締切・添付・提出状況)を取得する。読み取りのみ・受講登録済みコースのみ。

Inputs: url (required), idnumber (required).

get_courseA

講義の詳細(お知らせ・教材一覧・課題一覧)を取得する。受講登録中コースのみ。

Inputs: idnumber (required), refresh.

get_syllabusA

シラバスを取得する(UTAS のシラバス参照ページ)。公開情報のため受講登録外コースも取得可。受講登録済みコースは idnumber のみで可。受講登録外コースは search_courses が返す syllabusUrl を渡す。

Inputs: idnumber (required), syllabusUrl.

list_announcementsC

お知らせ一覧を取得する(時間割ヘッダー左上の吹き出しアイコン)。

Inputs: refresh.

list_assignmentsC

全科目横断の課題・テスト一覧と締切を取得する。

Inputs: refresh.

list_coursesB

受講登録している講義(時間割)の一覧を取得する。

Inputs: refresh.

list_messagesC

メッセージ一覧(UTOL のメッセージ=inquiry)を取得する。一覧のメタ情報のみで本文は含まない。

Inputs: refresh.

list_updatesC

更新情報(最近の活動)を取得する(時間割ヘッダー左上のベルアイコン)。教材追加・課題追加・提出・お知らせ等の通知。

Inputs: refresh.

refresh_cacheB

主要な一覧(受講登録コース・課題一覧)を再取得してキャッシュを更新する。

Inputs: no named parameters.

register_courseA

コースを受講登録する。【書き込み操作・受講登録(UTOL上のデータ)に影響】confirm:true が無い場合はプレビューのみ。実行は監査ログに記録。可逆(unregister_course で解除可能)。

Inputs: idnumber (required), confirm.

search_coursesA

UTOL のコース検索。受講登録外コースも対象だが、返却は公開カタログ情報(名称・教員・開講期・開講組織・概要・リンク)のみ。

Inputs: year, limit, keyword, teacher.

set_task_no_submissionA

課題の「提出不要」フラグを変更する(提出不要⇔未提出、可逆)。【書き込み操作】confirm:true が無い場合は実行せずプレビューを返す。実行は監査ログに記録される。

Inputs: idnumber (required), contentsId (required), noSubmission (required), confirm, +1 more.

unregister_courseA

コースの受講登録を解除する。【書き込み操作・受講登録(UTOL上のデータ)に影響/要注意】confirm:true が無い場合はプレビューのみ。実行は監査ログに記録。

Inputs: idnumber (required), confirm.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 15 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose and target resource (e.g., courses, assignments, messages, updates). Descriptions precisely define scope and usage, leaving no ambiguity between tools that might seem similar (e.g., get_assignment vs list_assignments, list_announcements vs list_updates).

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern in snake_case (e.g., get_course, list_courses, register_course). Verbs like 'get_', 'list_', 'search_', 'download_', 'refresh_', 'register_' are used predictably to indicate action type, enhancing readability and predictability.

    Tool Count5/5

    With 15 tools, the set is well-scoped for a university LMS MCP server. Each tool addresses a discrete operation without redundancy, covering authentication, course management, assignments, materials, syllabus, announcements, messages, and updates. The count feels complete and manageable.

    Completeness3/5

    Core student workflows are covered (view courses, assignments, materials, announcements; register/unregister courses; check syllabus). However, missing tools for assignment submission, grade viewing, and sending messages represent notable gaps that would hinder agents from completing common tasks without workarounds.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    • Create projects, nodes, and tasks in UluP Spaces by conversation with Claude.

    • Thought Industries MCP server for ChatGPT, Claude and any AI agent: list learners, enroll learner in course, import and invite learners, read content actions log, set content status and add learner to waitlist in your own Thought Industries account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Thought Industries yourself; Cotlet does not store your password and you need no Thought Industries API key. About the official Thought Industries API: Thought Industries has a REST API and a GraphQL API, but no MCP server you can connect today (checked 23 Oct 2026). Both APIs need a key an admin creates under Settings > Security, and the Claude plugin lists "a Thought Industries instance with API access enabled" as a prerequisite. Setup and FAQ: https://cotlet.dev/integrations/thought-industries-api-mcp-server

    • LearnUpon MCP server for ChatGPT, Claude and any AI agent: list users, invite users, add users to group, enroll group on course, enroll users on course, unenroll users, set enrollment complete and disable user in your own LearnUpon account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to LearnUpon yourself; Cotlet does not store your password and you need no LearnUpon API key. About the official LearnUpon API: LearnUpon has a REST API and a reporting MCP server, but neither covers day-to-day admin work from an AI agent (checked 20 Oct 2026). The REST API uses API keys that an admin generates under Settings > Integrations > API Keys, and Support grants them when the option is missing. Setup and FAQ: https://cotlet.dev/integrations/learnupon-api-mcp-server

    • Absorb LMS MCP server for ChatGPT, Claude and any AI agent: list users, list course enrollments, list overdue learners, approve enrollment request, enroll users in a course, message learners, create user and deactivate user in your own Absorb LMS account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Absorb LMS yourself; Cotlet does not store your password and you need no Absorb LMS API key. About the official Absorb LMS API: Absorb LMS has an Integration API, a REST API with JSON for learners, courses, departments and grades, but it needs a private key tied to your portal that your Absorb account team provides, and your own code (checked 20 Oct 2026). Absorb's Aura MCP for Claude and ChatGPT is planned for 27 Oct 2026 and is read and answer only. Setup and FAQ: https://cotlet.dev/integrations/absorb-lms-api-mcp-server

    Related MCP Servers