umd-mcp
University of Maryland のデータを公開する MCP サーバーです。コースと成績(PlanetTerp、Jupiterp、Schedule of Classes、Testudo 学生ポータル、ELMS)、食堂のメニューとニュース、Shuttle-UM のルートと時刻表、体育会、キャンパスカレンダー、TerpLink の団体とイベント、RecWell の施設と ActiveTerp レクリエーションポータル、University Senate、キャンパスディレクトリを提供します。
開発
pnpm install
pnpm dev # run the server on stdio with hot reload
pnpm inspect # open the MCP Inspector against the dev server
pnpm test # run tests
pnpm check # typecheck + lint + format check + knip (dead code) + tests
pnpm build # emit dist/
クライアントでの使用
MCP クライアントの設定(例:Claude Desktop、Claude Code)に追加します。
{
"mcpServers": {
"umd": {
"command": "node",
"args": ["/path/to/umd-mcp/dist/index.js"]
}
}
}
サインイン
UMD の一部のサービスでは、サインインしたユーザーが必要です。login ツールは、UMD Shibboleth IdP で umd-mcp が制御するブラウザーウィンドウ(Chrome または Edge。専用プロファイルは ~/.umd-mcp/browser-profile)を開き、CAS の service URL を 127.0.0.1 上の一度限りのリスナーに指定します。ユーザーが(Duo を含めて)サインインを完了すると、IdP はサービスチケットを付けてリダイレクトします。サーバーはそのチケットを serviceValidate で検証し、誰がサインインしたかを確認します。
シングルサインオンのセッションが有効な間に、login は同じウィンドウで接続済みのすべてのサービス(下記参照)にアクセスします。各アプリが独自のセッション Cookie を設定できるようにし、その Cookie をサービスごとの Session にコピーします。ウィンドウは自動的に閉じます。プロファイルは保持されるため、以降のログインでは通常、操作は不要です。logout はすべてを破棄し、プロファイルの Cookie を削除します。
ブラウザーを使う理由:CAS はログイン URL で指定されたサービスに対してのみチケットを発行し、各アプリはそのチケットを自身のオリジン用の Cookie に交換します。サーバーがそれらの Cookie を保持する唯一の方法は、受け取るブラウザーになることです。
コールバックホストは localtest.dev.umd.edu です。これは UMD IT が公開している DNS 名で、127.0.0.1 に解決されます。IdP は AWS WAF の背後にあり、service URL に localhost が含まれていると 403 で拒否するため、localhost の代わりに使用します。
環境変数:
UMD_MCP_BROWSER:Chrome または Edge がインストールされていない場合に使用する、Chromium 実行ファイルのパスです。
UMD_MCP_PROFILE_DIR:ブラウザープロファイルを保存する場所です。
CANVAS_TOKEN:Canvas の個人用アクセストークン(ELMS のプロフィール設定から取得)。設定すると、ELMS ツールはこれをベアラートークンとして使用し、ブラウザーでのサインインが不要になります。
ツール
サインイン用ツールを除き、ツール名は <integration>_<method> です。「(login)」と記されたインテグレーションでは、先に login ツールを実行する必要があります。「(optional login)」と記されたインテグレーションでは、実行後に取得できる情報が増えます。それ以外は匿名で利用できます。
shibboleth
| ツール | 説明 |
|---|
login | UMD Directory ID でサインインします。 |
logout | サインイン中のユーザーとすべてのサービスセッションを破棄し、サインイン用ブラウザーを消去して、次回のログイン時に再度プロンプトを表示します。 |
whoami | 現在サインインしている UMD ユーザー、または誰もサインインしていないこと、および有効なセッションがあるサービスを報告します。 |
activeterp
| ツール | 説明 |
|---|
activeterp_list_program_filters | activeterp.umd.edu のプログラムが分類されるカテゴリ(例:フィットネス、水泳、eスポーツ)とタグ(例:アドベンチャートリップ)です。 |
activeterp_list_programs | activeterp.umd.edu のプログラム(グループフィットネスクラス、水泳レッスン、アドベンチャートリップ、クリニック、キャンプ、eスポーツの予約)と料金です。分類またはタグで絞り込むこともできます。 |
activeterp_search_programs | サイトの検索バーと同様に、名前で activeterp.umd.edu のプログラムを検索します。 |
activeterp_get_program | activeterp.umd.edu のプログラムの説明、分類、料金、免責同意書が必要かどうか、スケジュールの組み方です。 |
activeterp_list_program_offerings | activeterp.umd.edu のプログラムについて、学期中に提供される各日付指定のセッションまたはシリーズと、その料金、空き状況、開催パターン、休講日です。 |
activeterp_list_program_instances | 近日中に予約可能な activeterp.umd.edu のプログラムの時間枠と、開始・終了時刻、場所、インストラクター、クラス定員、空き状況です。 |
activeterp_list_facilities | activeterp.umd.edu で予約可能な施設(現在は Terps Esports Center のブース)と、その上位施設および紹介文です。 |
activeterp_get_facility | activeterp.umd.edu の施設の説明、種類、エリア、最大収容人数、曜日ごとの通常営業時間です。 |
activeterp_get_facility_schedule | 日付範囲内の activeterp.umd.edu 施設カレンダーの予約情報です。施設を1つまたはすべて指定でき、繰り返しルールも含まれます。 |
activeterp_list_calendars | activeterp.umd.edu のホームページに表示できるカレンダー(例:グループフィットネスクラス、アドベンチャープログラム)です。 |
activeterp_list_calendar_events | activeterp.umd.edu のホームページのカレンダーに掲載されている、今後数日間に予定されているすべてのクラス、予約枠、イベントです。 |
activeterp-member(ログイン)
| ツール | 説明 |
|---|
activeterp_member_get_profile | サインイン中のメンバーのactiveterp.umd.eduプロフィール:氏名、大学ID番号、利用資格、生年月日、性別、登録されている連絡先情報。 |
activeterp_member_list_my_memberships | サインイン中のメンバーのRecWellメンバーシップ(現在および過去):種類、開始日と有効期限、更新条件、返金またはキャンセルの状況。 |
activeterp_member_get_access_history | サインイン中のメンバーの施設チェックイン履歴:施設、チェックイン端末、入退場デバイス、日時、入場が許可されたかどうか。 |
activeterp_member_list_my_orders | サインイン中のメンバーの注文:注文番号、日付、注文場所、合計金額、無効化されたかどうか。 |
activeterp_member_list_my_invoices | サインイン中のメンバーの請求書(すべて、または未払いのもののみ):番号、日付、合計金額、支払済み金額と未払い金額、PDFリンク。 |
activeterp_member_get_invoice | サインイン中のメンバーの請求書1件:請求先情報、小計、税額、合計金額、支払済み金額、未払い残高、明細項目。 |
activeterp_member_list_memberships | RecWellがactiveterp.umd.eduで販売するメンバーシップ(日別パス、無料のGroup FitnessおよびBouldering Zoneメンバーシップ)とその紹介文。 |
activeterp_member_get_membership | RecWellが販売するメンバーシップ1件と、購入可能な各期間:名称、請求方法、前払い価格、サインイン中のメンバーに適用される期間。 |
activeterp_member_list_towel_services | RecWellがactiveterp.umd.eduで販売するタオルサービス(学期ごと、年ごと)。 |
activeterp_member_get_towel_service | タオルサービス1件と、購入可能な各期間:名称、請求方法、前払い価格、サインイン中のメンバーに適用される期間。 |
activeterp_member_list_multi_visit_passes | RecWellが販売する複数回利用パス(パーソナルトレーニングのセッションパッケージ、メンバー向け利用パス):カテゴリー一覧、価格、購入条件。 |
activeterp_member_get_multi_visit_pass | 複数回利用パス1件:カテゴリー、価格、詳細説明、購入条件。 |
athletics
| ツール | 説明 |
|---|
athletics_list_sports | Maryland(Terps、umterps.com)のすべての代表チーム競技と、他の athletics ツールで使用する ID を取得します。 |
athletics_list_seasons | スケジュールがある競技の過去および現在のシーズンと、過去シーズンのスケジュールを取得するために athletics_get_schedule に渡すスケジュール ID を取得します。 |
athletics_get_schedule | Maryland チームのスケジュールと試合結果を取得します。日付、時刻、対戦相手、会場、テレビ/配信情報、試合後のスコアを含む全試合と、チームの成績を確認できます。 |
athletics_get_game | ID(athletics_get_schedule または athletics_get_calendar から取得)で指定した Maryland の試合を取得します。対戦相手、会場、メディアリンク、試合結果を確認できます。 |
athletics_get_roster | Maryland チームの現在の選手名簿を取得します。背番号、ポジション、学年、身長、体重、出身地、専攻を含む選手と、コーチ陣を確認できます。 |
athletics_search_players | umterps.com の全シーズンから、姓で Maryland の現役および元選手を検索します。必要に応じて、競技を指定できます。 |
athletics_get_coaches | Maryland チームのコーチ陣を取得します。役職、メールアドレス、電話番号、略歴ページへのリンクを確認できます。 |
athletics_get_news | Maryland Athletics の最新ニュース記事を新しい順に取得します。必要に応じて、競技を指定できます。 |
athletics_get_article | ストーリー ID で指定した Maryland Athletics のニュース記事(試合の振り返り、プレビュー、お知らせ)の全文を取得します。 |
athletics_get_calendar | 日付範囲内の全競技(または指定した競技)の Maryland の試合やイベントを日ごとにまとめて取得します。対戦相手、会場、メディアリンク、試合結果を確認できます。 |
athletics_get_upcoming_events | Maryland チームの今後数試合を取得します。日付、時刻、対戦相手、会場、視聴方法を確認できます。 |
calendar
| ツール | 説明 |
|---|
calendar_search_events | UMD キャンパスカレンダー(calendar.umd.edu)から、日付範囲内のイベントを検索します。必要に応じて、全文検索クエリ、イベントタイプ、対象者、注目イベントかどうかで絞り込めます。 |
calendar_get_event | ID またはスラッグで指定した UMD キャンパスカレンダーのイベントを取得します。詳細な説明、場所、連絡先、繰り返しルールを確認できます。 |
calendar_list_categories | UMD キャンパスカレンダーでイベントを分類するイベントタイプ、対象者、ステータスのカテゴリと、calendar_search_events で使用できるスラッグを取得します。 |
calendar_get_academic_calendar | Office of the Provost が承認した UMD の学期カレンダーを取得します。各年度について、数年先までの授業初日と最終日、休業期間、読書日、期末試験、卒業式、夏季セッションを確認できます。 |
clarice
| ツール | 説明 |
|---|
clarice_search_events | The Clarice Smith Performing Arts Center(theclarice.umd.edu)の今後の公演を検索します。タイトル、ジャンル、カテゴリ、または主催者で絞り込むこともできます。 |
clarice_get_event | スラッグを指定してClariceのイベントを1件取得します。説明、会場ごとの全公演、料金、会場と座席情報、コンテンツに関する注意事項、チケット販売IDを確認できます。 |
clarice-tickets
| ツール | 説明 |
|---|
clarice_tickets_list_events | 指定した期間内に公演がある、チケット販売対象のClariceイベント(Spektrix)を一覧表示します。ジャンルで絞り込むこともできます。 |
clarice_tickets_get_event | チケット販売IDを指定して、チケット販売対象のClariceイベントを1件取得します。説明と最初および最後の公演を確認できます。 |
clarice_tickets_list_performances | チケット販売対象のClariceイベントの全公演について、販売中かキャンセル済みか、およびオンライン販売期間を確認できます。 |
clarice_tickets_get_availability | Clariceの公演を1つ指定して、定員のうち販売中の座席数と車椅子スペース数を確認できます。 |
clarice_tickets_get_prices | Clariceの公演を1つ指定して、チケット種別と座席区分ごとの料金を確認できます。 |
dining
| ツール | 説明 |
|---|
dining_get_busy_meter | 「Dining Hall Status」ページの背後にあるサービスから、UMDの3つの食堂の現在の混雑状況(空いている、やや混雑している、非常に混雑している)を取得します。 |
dining_get_calendar | UMD Dining Servicesの今学期の重要な日程を取得します。食事プランの開始日、祝日や休暇中の営業時間、休業日、Dining Dollarの有効期限を確認できます。 |
dining_get_news | RSSフィードから、dining.umd.eduの最新の投稿(主に月刊ニュースレター「The Dish」)を取得します。 |
directory(ログインは任意)
| ツール | 説明 |
|---|
directory_search | UMDのキャンパスディレクトリで、姓(前方一致。「Pin*」のワイルドカードが使用可能)、氏名、メールアドレス、Directory ID、または電話番号から人物を検索します。 |
directory_search_advanced | UMDのキャンパスディレクトリで、姓と名、メールアドレス、勤務先電話番号、学部・部署、所属、機関を個別に指定して検索します。 |
directory_get_person | Directory ID(メールアドレスの@umd.eduより前の部分)を指定して、UMDのキャンパスディレクトリから人物を1人検索します。 |
elms(ログイン)
| ツール | 説明 |
|---|
elms_whoami | ELMS(Canvas)が認識しているサインイン中のユーザー情報です。名前、ログイン ID、メールアドレス、タイムゾーンが含まれます。 |
elms_list_courses | ELMS(Canvas)でサインイン中の学生が履修しているコースです。学期、担当教員、現在の成績状況が含まれます。 |
elms_get_course | ELMS(Canvas)のコースを 1 つ取得します。シラバス、フロントページ、有効になっているナビゲーションタブが含まれるため、課題、モジュール、お知らせ、ファイル、外部ツール(Zoom、Piazza、Gradescope)のうち、どれが利用できるかを確認できます。 |
elms_list_assignments | ELMS(Canvas)のコースにある課題を期限順に表示します。それぞれに、サインイン中の学生の提出状況とスコアが含まれます。 |
elms_get_submission | ELMS(Canvas)の課題 1 件に対する、サインイン中の学生の提出内容です。ステータス、スコア、成績、教員からのコメントが含まれます。 |
elms_get_grades | サインイン中の学生が履修しているすべての ELMS(Canvas)コース、または指定した 1 つのコースについて、現在のスコアと最終スコアを取得します。 |
elms_list_modules | ELMS(Canvas)のコースにあるモジュールと、その項目(課題、ファイル、ページ、リンク)、完了状況を表示します。 |
elms_list_announcements | 1 つ以上の ELMS(Canvas)コースに、指定した期間内(デフォルト:過去 14 日間)に投稿されたお知らせを表示します。 |
elms_get_todo | ELMS(Canvas)の ToDo サイドバーに表示されている、サインイン中の学生がまだ提出する必要のある課題と従来形式のクイズを取得します。 |
elms_get_planner | 期間を指定して(デフォルト:今後 14 日間)、すべての ELMS(Canvas)コースでサインイン中の学生に期限があるものや予定されているものを取得します。課題、クイズ、お知らせ、イベント、メモと、提出状況が含まれます。 |
elms_get_upcoming_events | Canvas のダッシュボードに表示される、すべての ELMS(Canvas)コースの今後のカレンダーイベントと課題の期限を取得します。 |
elms_get_activity_stream | サインイン中の学生が履修しているアクティブな ELMS(Canvas)コース全体の最近のアクティビティです。新しいお知らせ、ディスカッションの投稿、成績、メッセージが含まれます。 |
elms_list_conversations | サインイン中の学生の ELMS(Canvas)受信トレイにある会話を表示します。件名、参加者、最新のメッセージが含まれます。 |
elms_get_conversation | ELMS(Canvas)の受信トレイにある会話を 1 件取得します。会話内のすべてのメッセージが含まれます。 |
go(ログイン)
| ツール | 説明 |
|---|
go_list_links | サインイン中のユーザーが参加しているすべてのコレクションにある go.umd.edu の短縮リンクです。デフォルトでは新しい順に表示されます。 |
go_get_link | サインイン中のユーザーが所有する go.umd.edu のリンクの1つと、その統計ページです。リンク先、コレクション、メモ、時間別・日別・月別のクリック数、最もクリック数の多い日、クリック元を確認できます。 |
go_create_link | go.umd.edu の短縮リンクを作成します。キーワードを指定するか自動生成し、個人スペースまたはユーザーが参加しているコレクションの1つに保存できます。 |
go_update_link | サインイン中のユーザーが所有する go.umd.edu のリンクのリンク先を変更したり、キーワードを変更したり、別のコレクションに移動したり、メモを編集したりします。 |
go_delete_link | サインイン中のユーザーが所有する go.umd.edu のリンクを削除します。 |
go_get_qr_code | サインイン中のユーザーが所有する go.umd.edu のリンクを開く PNG QR コードです。 |
go_list_collections | サインイン中のユーザーが go.umd.edu で参加しているコレクションと、それぞれのリンク数およびメンバー数です。 |
go_create_collection | サインイン中のユーザーを最初のメンバーとして、go.umd.edu のコレクションを作成します。 |
go_update_collection | サインイン中のユーザーが所有する go.umd.edu のコレクションの名前または説明を変更します。 |
go_delete_collection | サインイン中のユーザーが所有する go.umd.edu のコレクションを削除します(リンクが残っている場合は拒否されます)。 |
go_list_collection_members | サインイン中のユーザーが所有する go.umd.edu のコレクション内のリンクを管理できる人です。 |
go_add_collection_member | Directory ID を使って、UMD の人物にサインイン中のユーザーが所有する go.umd.edu のコレクションへのアクセス権を付与します。 |
go_remove_collection_member | サインイン中のユーザーが所有する go.umd.edu のコレクションへのアクセス権を、その人物から取り消します。 |
go_lookup_users | go.umd.edu 独自の人物検索で、名前または Directory ID を使って UMD の人物を検索します。ログインは不要です。 |
go_list_transfer_requests | サインイン中のユーザーとの間で go.umd.edu のリンクを譲渡する、保留中の申し出です。 |
go_transfer_links | サインイン中のユーザーが所有する go.umd.edu のリンクの一部を別の UMD の人物に譲渡する申し出を作成します。相手が承諾すると、その人物がリンクの所有者になります。 |
go_accept_transfer_request | go.umd.edu で別の人物からサインイン中のユーザーに申し出のあったリンクを承諾します。 |
go_reject_transfer_request | 別の人物からサインイン中のユーザーに申し出のあったリンクを拒否するか、ユーザー自身が行った申し出を取り消します。 |
imleagues
| ツール | 説明 |
|---|
imleagues_list_leagues | 今学期にIMLeaguesで開催されるUMDの学内スポーツリーグ。各リーグの登録状況、登録締切日、シーズンの日程を確認できます。 |
imleagues_get_standings | IMLeagues上のUMD学内スポーツリーグの順位表。リーグ全体および各ディビジョン内の順位と、タイブレークの順序を確認できます。 |
imleagues_list_handbooks | UMD Intramural SportsがIMLeaguesに掲載しているハンドブックとマニュアル。全学向け、または特定のスポーツ向けのものを確認できます。 |
imleagues-member(ログイン)
| ツール | 説明 |
|---|
imleagues_member_list_my_teams | IMLeaguesにログイン中のメンバーが所属するUMD学内スポーツチームと、各チームのキャプテンを確認できます。 |
imleagues_member_get_league | UMD学内スポーツリーグのルール、各ディビジョンの時間枠と残り枠数、各ディビジョンの全チームのロスター人数とキャプテンを確認できます。 |
imleagues_member_get_team | UMD学内スポーツチームのリーグ、ディビジョン、成績と得点、メンバーの名前と役割、レギュラーシーズンおよびプレーオフの全試合の結果と会場を確認できます。 |
imleagues_member_get_game | UMD学内スポーツの1試合について、開催日時と場所、ステータス、両チームの成績と順位、最終スコアおよび各ピリオドのスコアを確認できます。 |
jupiterp
| ツール | 説明 |
|---|
jupiterp_list_departments | Jupiterp にあるすべての4文字の学部コードとその名称です。 |
jupiterp_list_courses | Jupiterp が Schedule of Classes から取得した UMD の授業情報です。授業名、単位数、一般教育科目、前提条件と履修制限に関する注記、説明が含まれます。 |
jupiterp_list_sections | Jupiterp にある、当学期の UMD 授業のセクションです。Jupiterp のスラッグ付き担当教員、曜日、時間、教室、定員、ウェイトリスト、保留ファイルの件数が含まれます。 |
jupiterp_list_instructors | Jupiterp に掲載されている UMD の教員です。学生による平均評価(PlanetTerp と Jupiterp のレビューを統合)と、担当した学期が含まれます。 |
jupiterp_list_reviews | Jupiterp に掲載されている UMD 教員への承認済み学生レビューです。PlanetTerp からインポートされたレビューも含まれます。 |
jupiterp_get_grades | Jupiterp に掲載されている、UMD の授業セクションごとの成績分布です。レジストラが公開した、2010年秋学期以降の秋学期および春学期のデータです。 |
jupiterp_get_grade_summary | Jupiterp に掲載されている、セクションを集計した成績分布です。授業別、授業と学期別、授業と教員別、教員別、または教員と学期別に集計できます。 |
jupiterp_list_grade_terms | Jupiterp に成績データがある学期を新しい順に表示します。セクション数、授業数、大学全体の GPA も含まれます。 |
maps
| ツール | 説明 |
|---|
maps_list_buildings | UMD キャンパスマップ(maps.umd.edu)に掲載されている建物です。建物ごとに、番号、Testudo で使用されるコード、分類、カテゴリ、所在地が含まれます。 |
maps_get_building | UMD キャンパスマップに掲載されている建物を番号またはコードで指定します。住所、延べ床面積と賃貸可能面積、所有者、建築年と改修年、入居者が含まれます。 |
maps_list_parking_lots | UMD キャンパスマップに掲載されている駐車場と駐車ガレージです。対象者、許可証が必要な時間、掲示されている規則、駐車スペース数と許可証数、所在地が含まれます。 |
maps_list_closures | UMD キャンパスマップに掲載されている駐車場、駐車ガレージ、道路の閉鎖情報です。閉鎖箇所、日付、告知へのリンクが含まれます。 |
maps_list_amenities | UMD キャンパスマップに掲載されている、キャンパス内のすべてのジェンダーニュートラルまたはファミリー用トイレ、授乳室、シャワー、更衣台、エレベーターです。建物と部屋ごとに表示されます。 |
maps_list_dining_locations | UMD キャンパスマップに掲載されている、ダイニングホール、各ホールのフードステーション、カフェ、各フードコートの店舗、レストラン、ショップ、フードパントリーです。 |
maps_list_residence_halls | UMD キャンパスマップに掲載されている学生寮です。コミュニティ、建築年、間取り、部屋の広さ、共用バスルームの種類が含まれます。 |
栄養
| ツール | 説明 |
|---|
nutrition_get_menu | nutrition.umd.edu から取得した、指定日のUMD食堂で提供される料理。食事時間帯やステーションごとに、各料理のアレルゲンと食事ラベルも確認できます。 |
nutrition_get_recipe | UMD食堂のメニューにある料理の栄養成分表示です。1食分の量、カロリー、1日の摂取基準値付きの栄養成分、原材料、アレルゲンを確認できます。 |
planetterp
| ツール | 説明 |
|---|
planetterp_get_course | PlanetTerpで、UMDのコースをコードから検索します。 |
planetterp_list_courses | PlanetTerpに掲載されているUMDのコースをアルファベット順に一覧表示します。学部を指定して絞り込むこともできます。 |
planetterp_get_professor | PlanetTerpで、UMDの教授またはティーチングアシスタントを名前から検索します。 |
planetterp_list_professors | PlanetTerpに掲載されているUMDの教授とティーチングアシスタントをアルファベット順に一覧表示します。 |
planetterp_get_grades | PlanetTerpに掲載されている、コース、教授、またはその両方の成績分布をセクションごとに表示します。 |
planetterp_search | サイトの検索バーと同様に、コードや名前に検索語が含まれるコースや教授をPlanetTerpで検索します。 |
recwell
| ツール | 説明 |
|---|
recwell_get_facility_alerts | RecWell施設の最新のお知らせです。祝日や短縮営業、休業、規則の変更を、見出し付きのセクションと営業時間の表があればその表で確認できます。 |
recwell_list_facilities | RecWell施設を、屋内と屋外に分けて一覧表示します。各施設の説明とリンクも確認できます。 |
recwell_get_facility | RecWell施設のページ情報です。説明、季節ごとの通常営業時間(学期ごとに1つのタブで表形式)、利用規則、レンタル情報、駐車場情報を確認できます。 |
recwell_get_group_fitness_schedule | RecWellのグループフィットネスクラスの週間スケジュールです。クラス、場所、インストラクター、開始時刻と終了時刻、登録リンクを確認できます。曜日を指定して絞り込むこともできます。 |
recwell_list_club_sports | RecWellのすべてのクラブスポーツについて、ウェブサイト、問い合わせ先のメールアドレス、寄付ページを確認できます。 |
senate
| ツール | 説明 |
|---|
senate_list_legislation | University Senate(senate.umd.edu)で審議中の法案:各法案の状況と審査担当者を確認できる現学年度の法案、または2001年までさかのぼる過去の法案アーカイブです。 |
senate_get_bill | IDまたは文書番号で指定するUniversity Senateの法案:提案内容、提案者、ポリシーへのリンク、関連法案、日付、決定事項、各段階で提出されたPDFを含むすべての審議履歴です。 |
senate_list_senators | University Senateの現職議員と、それぞれの議席、代表区分、所属カレッジ、任期終了日です。 |
senate_get_constituent | UMD Directory IDで指定するキャンパスコミュニティのメンバーについて、University Senateでの登録情報を確認できます。所属カレッジ、学部、役職、所属区分、代表区分が含まれます。 |
senate_list_committees | University Senateの常設委員会と特別委員会、委員を選出する大学評議会、および過去の評議会やタスクフォースの一覧です。それぞれに1段落の概要が付いています。 |
senate_get_committee | 名前で指定するUniversity Senateの委員会、大学評議会、過去の評議会またはタスクフォース:担当範囲、委員長、連絡先を含むページのテキスト、議席と所属カレッジを含む現職委員、および審査中の法案です。 |
senate_list_past_committee_legislation | University Senateの各常設委員会が審査したすべての法案を、委員会と学年度ごとに分類した一覧です。2001年までさかのぼります。 |
senate_get_committee_meetings | University Senateの常設委員会について、学年度ごとの会議日時と各会議の議題を確認できます。 |
senate_get_meetings | University Senateの学年度ごとの会議スケジュールです。各会議の議題、資料、スライド、議事録、およびアーカイブの対象年が含まれます。 |
terplink
| ツール | 説明 |
|---|
terplink_search_organizations | TerpLink 上の約 1,000 件の活動中の学生団体を、名前またはキーワードで検索します。必要に応じて、terplink_list_organization_categories のカテゴリで絞り込めます。 |
terplink_get_organization | TerpLink の学生団体 1 件の詳細プロフィールです。説明、メールアドレス、種類、主な連絡先、ソーシャルリンク、郵送先住所を確認できます。 |
terplink_list_organization_categories | TerpLink で学生団体に設定されているカテゴリ(Academic、Cultural/Ethnic、Honor Society、...)です。 |
terplink_search_events | キーワード、日付範囲、主催団体、カテゴリ、テーマ、特典で TerpLink のイベントを検索します。 |
terplink_get_event | TerpLink のイベント 1 件の詳細です。説明、会場またはミーティングリンク、主催者、カテゴリ、特典、RSVP 定員を確認できます。 |
terplink_list_event_categories | TerpLink のイベントに付けられているカテゴリ(Academic、Service、Sports and Recreation、...)です。 |
terplink_get_news | 学生団体や学部が TerpLink に投稿したニュース記事を新しい順に取得します。必要に応じて、キーワードまたは団体で絞り込めます。 |
terplink_get_article | TerpLink のニュース記事 1 件を、本文全体のプレーンテキストで取得します。 |
terplink_search_service_opportunities | UMD の学生向けに掲載されたボランティアおよび地域奉仕の機会(GivePulse からミラーリング)を、キーワードで検索します。 |
testudo-soc
| ツール | 説明 |
|---|
testudo_soc_list_terms | UMD Schedule of Classes に現在掲載されている学期(通常は、現在の学期と今後数学期の計4学期ほど)です。 |
testudo_soc_list_departments | UMD Schedule of Classes から取得した、学期に開講する学科(4文字のコース接頭辞)です。 |
testudo_soc_list_courses | UMD Schedule of Classes から取得した、学科が学期に開講するすべてのコースです。科目名、単位数、評価方法、一般教育コード、前提条件、説明が含まれます。 |
testudo_soc_get_course | UMD Schedule of Classes から取得した、学期の1つのコースとすべてのセクションです。担当教員、定員、開講曜日、時刻、教室、授業形態が含まれます。 |
testudo_soc_get_sections | UMD Schedule of Classes から取得した、学期の1つ以上のコースのセクションです。担当教員、定員、開講曜日、時刻、教室、授業形態が含まれます。 |
testudo_soc_search_courses | 検索フォームと同じ方法で、UMD Schedule of Classes の学期を検索します。 |
testudo_soc_autocomplete_courses | UMD Schedule of Classes のオートコンプリートから取得した、指定したテキストでIDが始まる学期内のコースIDと科目名です。 |
testudo_soc_autocomplete_instructors | UMD Schedule of Classes のオートコンプリートから取得した、指定したテキストを姓または名に含む、学期内の担当教員です。 |
testudo_soc_list_gen_ed_categories | UMD Schedule of Classes に学期ごとに掲載されている、一般教育のカテゴリと要件コード(FSAW、DSHS、DVUP、...)です。 |
testudo_soc_list_gen_ed_courses | UMD Schedule of Classes から取得した、学期内の1つの一般教育要件を満たすコースです。 |
testudo_soc_list_syllabi | UMD Schedule of Classes のシラバスリポジトリに保存されている、コースの過去のシラバスです。それぞれの学期と担当教員が含まれます。 |
testudo_soc_get_building | セクションに記載された建物コードと教室番号で教室の建物を検索します。正式名称、キャンパスの建物番号、地図へのリンクが含まれます。 |
testudo (ログイン)
| ツール | 説明 |
|---|
testudo_get_current_term | Testudo 学生ポータルから取得した、UMD の現在の学期、その登録状況と主な日程です。 |
testudo_list_terms | サインイン中の学生が指定した Testudo 機能を利用できる学期です。「schedule」は授業スケジュールがある学期(testudo_get_schedule と併用)、「grades」は成績が公開された学期、「enrollment_certification」は在学証明書を注文できる学期、「graduation」は卒業日が設定される可能性のあるすべての学期、「graduation_application」は卒業申請を受け付けている学期、「grade_option」は合否判定方式の選択期間が開いている学期を一覧表示します。 |
testudo_get_schedule | Testudo 学生ポータルから取得した、サインイン中の学生の学期別授業スケジュールです。登録済みの各クラスについて、担当教員、単位数、授業形式、週ごとの授業(曜日、時刻、建物、教室)を含みます。 |
testudo_get_grades | Testudo 学生ポータルから取得した、サインイン中の学生の学期別成績です。学期中は中間成績、公開後は最終成績、学期 GPA と累積 GPA を含みます。 |
testudo_get_unofficial_transcript | Testudo 学生ポータルから取得した、サインイン中の学生の非公式成績証明書(プレーンテキスト)です。編入単位、過去に履修したすべての科目とその成績、現在履修中の科目を含みます。 |
testudo_get_profile | Testudo 学生ポータルから取得した、大学に登録されているサインイン中の学生の連絡先情報です。氏名、メールアドレス、電話番号、現住所と本籍地、緊急連絡先を含みます。 |
testudo_get_registration_appointment | Testudo 学生ポータルから取得した、サインイン中の学生が授業に登録できる時期です。次学期の登録予約、アカウントに設定されているブロック、登録されている専攻、副専攻、修了証明課程を含みます。 |
testudo_get_request_status | サインイン中の学生が Testudo 学生ポータルで申し込んだ公式成績証明書と在学証明書の注文状況、および新たな注文を妨げる可能性のある司法上または財務上のブロックです。 |
testudo_get_graduation_application_status | Testudo 学生ポータルから取得した、サインイン中の学生の卒業申請です。申請対象の学期、卒業証書に記載する氏名と郵送先住所、各学位の状況を含みます。 |
testudo_get_grade_options | Testudo 学生ポータルから取得した、サインイン中の学生が学期の各科目で選択した成績評価方式(通常または合否判定)と、合否判定方式の単位数合計です。 |
testudo_get_parent_access | サインイン中の学生が Testudo の記録へのアクセスを許可した保護者またはゲストのアカウントです。 |
交通
| ツール | 説明 |
|---|
transportation_list_routes | 公開されている GTFS フィードに基づき、現在の時刻表に含まれる Shuttle-UM のすべてのバス路線(104 College Park Metro などの通常路線とイベント路線)と、それぞれの路線が今日運行しているかどうかを取得します。 |
transportation_get_route | 公開されている GTFS フィードに基づき、指定した日の最も一般的な運行パターンにおける Shuttle-UM の指定路線の停留所(順番どおり)と、路線のポリラインを取得します。 |
transportation_list_stops | 公開されている GTFS フィードから、名前の一部または地点からの距離で絞り込んだ Shuttle-UM のバス停を取得します。 |
transportation_get_stop | 公開されている GTFS フィードに基づき、Shuttle-UM の指定バス停の場所と、その停留所を経由するすべての路線を取得します。 |
transportation_get_schedule | 公開されている GTFS フィードに基づき、指定した日付の Shuttle-UM 路線の出発予定時刻を取得します。オプションで停留所を指定できます。 |
transportation_get_service_alerts | Shuttle-UM の最新の運行情報とアラート(迂回、時刻表の変更)、および DOTS の時刻表ページからリンクされている変更運行のお知らせを取得します。 |
transportation_get_service_calendar | 学年度の Shuttle-UM 運行カレンダーを取得します。各休業期間、試験週間、学期間の期間について、日付、通常運行または変更運行の別、および詳細を記載したお知らせページを確認できます。 |
インテグレーションの追加
インテグレーションは src/integrations/ 配下のフォルダーで、1 つの上流サービスをラップし、提供するツールを宣言します。
src/integrations/example/
index.ts # the Integration subclass, and nothing else
schemas.ts # input schemas, exported output schemas, and their inferred types
mappers.ts # Raw* types for the upstream payloads and the to*() functions (parsers.ts when scraping HTML)
公開側とサインイン後の側を持つ上流サービスは、兄弟フォルダー内の 2 つのクラスになります(testudo/soc と testudo/portal、activeterp/catalog と activeterp/member)。共有するものは、同じ場所に置く common.ts にまとめます。
src/integrations/base.ts の Integration をサブクラス化し、name と baseUrl を宣言して、各ツールメソッドに @tool() を付けます。MCP ツール名は <name>_<method> です(上書きするには spec に name を渡します)。次に、src/integrations/index.ts の createIntegrations() にクラスを追加します。
import { z } from 'zod';
import { Integration, tool } from '../base.js';
import { type Building, buildingSchema } from './schemas.js';
export class Example extends Integration {
readonly name = 'example';
readonly baseUrl = 'https://example.umd.edu/api';
@tool({
title: 'Get campus building',
description: 'Look up a campus building by its code. No login needed.',
input: { code: z.string().describe('Building code, e.g. "IRB"') },
output: buildingSchema.shape,
})
async get_building({ code }: { code: string }): Promise<Building> {
return this.get<Building>(`buildings/${code}`);
}
}
spec のすべての情報はクライアントに公開されるため、モデルはツールを呼び出す前に、そのツールの機能、受け取る情報、返す情報を把握できます。
description と title はそのまま渡されます。annotations はデフォルト(読み取り専用、オープンワールド)にマージされます。
input はツールの inputSchema になります。デコレーターは、メソッドのパラメーター型が解析済みの形状を受け入れることをコンパイル時に確認します。
output(省略可能)はツールの outputSchema になります。デコレーターは、メソッドが一致するオブジェクトを返すことをコンパイル時に確認します。実行時には値が形状に対して検証され、structuredContent として、またテキストのみを読み取るクライアント向けの JSON テキストブロックとして返されます。形状に含まれないフィールドは削除されます。
既存のインテグレーションでは、次の規約に従っています。
- すべての入力フィールドと出力フィールドに
.describe() を使用します。説明文はモデルが読み取る JSON Schema に含まれます。説明の末尾には「ログイン不要です。」または「ログインが必要です。」を付けます。
- 上流サービスで値の一覧が既知の場合は、
CODE: 'value' テーブルと src/common.ts の decode() を使用して、z.enum を使います。上流サービスから予期しない値が返された場合は、ツールエラーとして通知されます。
src/common.ts の共有スキーマ(term、courseId、sectionId、weekday、isoDate、pagination、…)と、src/lib/ のヘルパーを再利用します。text.ts(空白のトリミング、空文字列を null に変換、結合)、html.ts(HTML をプレーンテキストに変換)、scrape.ts(cheerio のテキスト、リンク、テーブル)、dates.ts(印字された日付を YYYY-MM-DD に変換)。パーサーを手書きする前に、npm パッケージの利用を検討してください。
this.get(path, query) は JSON を、this.getText() は baseUrl を基準とした HTML を取得します。this.postForm() と this.postJson() は、サイト独自のフォームやスクリプトが送信する内容を送信し、this.request() は汎用のリクエストです。クエリ値には配列を指定でき(キーが繰り返されます)、すべてのリクエストには 1 分のタイムアウトが設定されています。HTTP エラー(サーバーがメッセージを返す場合はそのメッセージを含む)、ネットワーク障害、出力スキーマとの不一致は、自動的にツールエラーの結果になります。この動作をカスタマイズするには handleError() をオーバーライドします。
- 匿名のフローでもサーバーセッションが必要な場合(セッションに保存される検索、Cookie に紐付いたトークンなど)は、
src/lib/http.ts の cookieFetcher() を使って fetcher をオーバーライドします。サインイン済みセッション中に一度だけ読み取る値(CSRF トークン、アカウント ID など)には、src/lib/session.ts の perSession() を使用します。
シングルサインオンを介するインテグレーション
上流サービスで UMD ログインが必要な場合は、インテグレーションに service を宣言します。これにより login は他のすべてのサービスとともに、そのサービスにもサインインします。また、this.get()/this.getText()/this.request() はアプリの Cookie を引き継ぎます。ユーザーがサインインする前、またはアプリがセッションを拒否した後は AuthRequiredError がスローされ、モデルに login の呼び出しを促すツールエラーになります。
export class StudentPortal extends Integration {
readonly name = 'testudo';
readonly baseUrl = 'https://app.testudo.umd.edu/services';
override readonly service = {
name: 'testudo',
// Page that sends an anonymous browser through single sign-on and back into the app.
loginUrl: 'https://app.testudo.umd.edu/main/',
// Optional: when the browser counts as signed in. Default is "same origin as loginUrl".
signedIn: (url: URL) => url.hash.startsWith('#/main'),
// Optional: fields to POST to loginUrl for apps whose sign-in is a button, not a redirect.
// loginForm: { login: 'Log in' },
// Optional: a button to click on loginUrl when its form carries a per-page token the
// browser must send (an anti-forgery token, a provider field).
// loginClick: 'button.btn-sso-shibboleth',
// Optional: when a response means the session is gone. Default: 401, or a redirect off
// the app's origin or to signInPage.
// expired: (response, requested, landed) => response.status === 403 || landed.pathname === '/expired',
// Optional: the app's own sign-in page, for apps that bounce an expired session there
// (same origin, HTTP 200) instead of answering 401 or redirecting to the IdP.
// signInPage: (url: URL) => url.pathname === '/shortener/signin',
};
}
プロジェクトの構成
src/
index.ts # stdio entrypoint
server.ts # createServer(): registers every integration
common.ts # shared zod schemas and small helpers (terms, course ids, weekdays, enums)
lib/ # HTTP helper, sign-in hub (auth.ts), per-service Session, browser driver,
# text/HTML/scraping helpers
integrations/
base.ts # Integration base class, @tool decorator, result helpers
index.ts # createIntegrations(): instantiate integrations here
<name>/ # one folder per integration (see above)
testudo/soc/ # public Schedule of Classes
testudo/portal/ # student portal (login)
grouper/NOTES.md # research only; Grouper is VPN-only and not implemented