Anteater MCP について
Anteater MCPは、UC Irvineの学生向けに、ライブの授業情報、過去の成績、履修条件、学位要件を使った科目検索と履修計画を支援します。時間割の競合や学位の進捗も確認できます。
主な機能
- 01開講クラスの検索と科目推薦
- 02過去の成績と履修推移の確認
- 03履修条件と時間割の競合チェック
- 04AP単位と学位進捗の評価
- 056件のガイド付きプロンプトと4件の参照リソース
活用シーン
- 01時間条件に合う空席のあるクラス探し
- 02教員の過去の成績を基にした科目比較
- 03作成した時間割の競合確認
- 04修得済み科目とAPスコアによる学位要件の確認
MCP 対応
MCP サーバーとして、20個のツール、6件のガイド付きプロンプト、4件の参照リソースをMCPクライアントに提供します。stdioとStreamable HTTPに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e ANTEATER_MCP_TOKEN -e ANTEATER_API_KEY -e ANTEATER_TRUSTED_PROXIES -e ZOTCOURSE_API_BASE ghcr.io/kkazuhak/anteater-mcp:v1.0.0-beta.3ANTEATER_MCP_TOKENシークレットShared secret clients must present as 'Authorization: Bearer <token>'. Required before exposing the server beyond loopback.ANTEATER_API_KEYシークレットYour own Anteater API key. Optional, but anonymous calls share a global hourly quota. Request one at https://dashboard.anteaterapi.com and choose type 'secret'.ANTEATER_TRUSTED_PROXIESWhich peers may set X-Forwarded-*. Defaults to 'private', which covers the Docker bridge. Without it the server ignores forwarded headers, because they are client-supplied.ZOTCOURSE_API_BASEIndependent fallback for live schedule data when Anteater API is unavailable. Set to 'off' to disable.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/kkazuhak/anteater-mcp:v1.0.0-beta.3Streamable HTTPツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Anteater MCP
リリース 1.0.0-beta.2 では、MCPHub の個人用と共有用を別々に設定できるようになり、HTTP ホスティングでリクエストごとに任意の上流キーを指定できるようになりました。キャッシュは認証情報ごとに分離されます。 共有サービスでは、キーが設定されていない場合、引き続き匿名で上流の割り当てを利用できます。
Claude と ChatGPT が UC Irvine での履修科目選びをサポートする MCP サーバーです。
Anteater API をラップしています。Anteater API では、UCI のコースカタログ、最新の授業スケジュール(WebSoc)、過去の成績分布、履修履歴、前提条件ツリー、AP 単位、学位要件、補足的な RMP 評価を利用できます。学生が実際に尋ねる質問に合わせて、20 個のツール、6 個のガイド付きプロンプト、4 個の参照リソースとして提供します。
実行時の依存関係はありません。 Node 24 LTS でソースを実行するか、同じ Node ランタイムを内蔵した Linux、macOS、Windows 用のスタンドアロン実行ファイルをダウンロードしてください。
"Find me a GE-2 for Fall that ends before 5pm and still has seats, ranked by how well people do."
Course Title Units GPA A% n SeatsOpen Example meeting
------------ ------------------- ----- ---- --- ---- --------- ---------------------------
BIO SCI 17 EVO PSYCHOLOGY 4 3.80 88% 2410 2 TuTh 15:30-16:50 @ SH 134
UNI STU H30A ANALYSIS HEALTH LIT 4 3.77 84% 864 15 TuTh 12:30-13:50 @ ALP 1600
LPS 31 INTRO INDUCT LOGIC 4 3.61 80% 2108 11 TuTh 14:00-15:20 @ EH 1200
クイックスタート
git clone https://github.com/KKazuhaK/Anteater-MCP.git
cd anteater-mcp
node --version # Node 24 LTS
node anteater-mcp.mjs --list-tools # confirm it runs
続いて、クライアントに追加してください。Claude Desktop、 Claude Code、ChatGPT、または **その他の MCP クライアント**に対応しています。
ほかに必要なものはありません。API キーは任意ですが、設定をおすすめします。
インストール
スタンドアロンバイナリ
各 GitHub リリースには、amd64 および arm64 向けの Linux、macOS、Windows 用ネイティブアーカイブと、SHA256SUMS.txt が含まれています。Node.js は不要です。
# After downloading and extracting the archive for your platform:
./anteater-mcp --version
./anteater-mcp --list-tools
MCP クライアントの設定では、anteater-mcp(または anteater-mcp.exe)の絶対パスを command に指定し、args 配列は省略してください。macOS アーカイブはアドホック署名されています。Developer ID による公開署名と公証は、まだ設定されていません。
Docker
公開イメージは Linux の amd64 および arm64 に対応しています。macOS と Windows の Docker Desktop では、同じ Linux イメージが実行されます。
cp .env.example .env
# Set ANTEATER_MCP_TOKEN in .env, then:
docker compose up -d
curl -fsS http://127.0.0.1:8787/health
Compose サービスは非 root、読み取り専用、ケイパビリティなしで、デフォルトではループバックにバインドされます。パブリック HTTPS の背後に配置する前に、DEPLOY.md を確認してください。
Claude Desktop
設定ファイルを開きます。
| OS | パス |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json |
anteater エントリを追加します。パスは絶対パスで指定する必要があります。Claude Desktop はプロジェクトディレクトリからサーバーを実行しません。
{
"mcpServers": {
"anteater": {
"command": "node",
"args": ["/absolute/path/to/anteater-mcp/anteater-mcp.mjs"]
}
}
}
API キーを設定する場合:
{
"mcpServers": {
"anteater": {
"command": "node",
"args": ["/absolute/path/to/anteater-mcp/anteater-mcp.mjs"],
"env": { "ANTEATER_API_KEY": "your-secret-key" }
}
}
}
Claude Desktop を完全に再起動してください(ウィンドウを閉じるだけではなく、終了してください)。20 個の Anteater ツールが表示され、6 個のプロンプトがスラッシュコマンドとして表示されます。
このリポジトリにある claude_desktop_config.example.json は同じ設定内容で、そのままコピーして使えます。
Claude Code
claude mcp add anteater -- node /absolute/path/to/anteater-mcp/anteater-mcp.mjs
キーを設定する場合:
claude mcp add anteater -e ANTEATER_API_KEY=your-secret-key -- node /absolute/path/to/anteater-mcp/anteater-mcp.mjs
claude mcp list で確認してください。
ChatGPT
2 つの方法があります。1 つ目はサーバーが不要です。
A. Actions を使ったカスタム GPT — ホスティング不要
- ChatGPT → GPT を探す → 作成 → 構成 → 新しいアクションを作成
gpt-actions-openapi.jsonの内容をスキーマボックスに貼り付けます- 認証 — 使用可能な選択肢は 2 つあります。
- なし。 Anteater API は匿名で読み取り可能です。最も簡単ですが、ほかのすべての匿名呼び出し元と共通の時間単位の上限を使うため、429 エラーが発生します。
- API Key → Auth Type: Bearer を選び、Anteater API キーを指定します。ChatGPT はすべての呼び出しで
Authorization: Bearer <key>を送信し、専用の上限を利用できます。⚠️ キーは GPT とともに保存されるため、GPT を共有した相手は誰でもあなたのキーを使えます。非公開の GPT なら問題ありませんが、キーを含めたまま公開しないでください。
gpt-instructions.mdを Instructions ボックスに貼り付けます
GPT は anteaterapi.com を直接呼び出します。12 個の操作で、コース、WebSoc、成績、履修履歴、学位要件を扱えます。
トレードオフ: GPT が受け取るのは生の JSON です。WebSoc のレスポンスは 4 階層(schools > departments > courses > sections)にネストされているため、広範なクエリは Actions によって切り詰められます。付属の指示では、必ず対象を絞り込むよう指示しています。前提条件の評価と競合の検出は利用できません。モデルが自力で推論する必要があります。
B. MCP サーバーをホスト — すべての機能を利用
ChatGPT の開発者モードコネクターには、公開 HTTPS MCP エンドポイントが必要です。
node anteater-mcp.mjs --http --port 8787 # binds 127.0.0.1 only — do not add --host
# in another terminal
ngrok http 8787 # or: cloudflared tunnel --url http://localhost:8787
設定 → コネクター → 詳細設定 → 開発者モード で URL を追加します。一括コース検索、決定論的な学位進捗チェック、前提条件のチェック、競合の検出を含む、20 個すべてのツールが動作します。
ChatGPT の開発者モードでは、OAuth、認証なし、または混合方式をサポートしています。カスタムヘッダーを指定する欄がないため、トークンを URL のクエリ文字列に含めます。
https://<your-domain>/mcp?token=<ANTEATER_MCP_TOKEN>
この URL 形式は互換性のための選択肢であり、セキュリティを高めるものではありません。URL はコネクターの設定やリバースプロキシのログに保存される場合があります。クライアントが対応している場合は、Bearer ヘッダーを使用してください。
ChatGPT が受け付ける 2 つのトランスポート、SSE とストリーミング HTTP はどちらも実装されています。トンネルではなく恒久的にデプロイする場合は、DEPLOY.md に従ってください。セットアップは Claude の場合と同じで、コネクターの UI だけが異なります。
⚠️
ANTEATER_MCP_TOKENが設定されていない場合、エンドポイントは認証されません。公開する前に設定してください。HTTP モードのセキュリティを参照してください。
⚠️ ChatGPT の MCP プラグインは Web 専用です。 OpenAI の公式ドキュメントによると、開発者モードは「Pro、Plus、Business、Enterprise、Education アカウントのウェブ版で利用可能」です。スマートフォンアプリからは MCP サーバーに接続できません。スマートフォンで ChatGPT を使う場合は、このサーバーのREST ファサードを参照する Action を設定したカスタム GPT を使用してください。
ChatGPT の各方法で利用できる機能
| カスタム GPT + Actions | 開発者モード + MCP | |
|---|---|---|
| サーバーが必要 | いいえ | はい、公開 HTTPS が必要 |
| 認証方法 | なし · API Key(Basic/Bearer/カスタムヘッダー)· OAuth | アクセストークン/API キー(Bearer、Basic、またはカスタムヘッダー方式)· OAuth · なし。Claude のコネクター画面ではリクエストヘッダーも設定できるため、?token= はあくまで代替手段です |
| Anteater キーを使用可能 | はい、API Key → Bearer | はい、サーバー側で ANTEATER_API_KEY を設定 |
| モデルが利用できるもの | 12 個の生の API 操作、JSON | 整形済みの 20 個すべてのツールに加え、6 個のプロンプトと 4 個のリソース |
| 前提条件/競合のチェック | いいえ — モデルが自力で推論する必要があります | はい |
| モバイルで動作 | はい | いいえ — MCP プラグインは Web 専用 |
スマートフォンで
Claude の iOS アプリと Android アプリは、リモート MCP サーバーに対応しています。これを HTTPS の背後にデプロイし、ブラウザーで claude.ai に一度追加すると、アプリにも同期されます。スマートフォンから新しいサーバーを追加することはできません。DEPLOY.md には、トークン認証、systemd ユニット、Caddy または nginx、コネクターのセットアップまで、手順がすべて記載されています。
ChatGPT Custom GPT の方法もモバイルで使え、サーバーは一切必要ありません。
Codex
Codex はストリーミング可能な HTTP に対応し、トークンを環境変数から読み取るため、設定ファイルにトークンが残ることはありません。
export ANTEATER_MCP_TOKEN=... # in your shell profile
codex mcp add anteater --url https://your.domain/mcp --bearer-token-env-var ANTEATER_MCP_TOKEN
または、~/.codex/config.toml に直接書き込むこともできます。プロジェクトローカルの .codex/config.toml は、グローバルの設定ファイルより優先されます。
[mcp_servers.anteater]
url = "https://your.domain/mcp"
bearer_token_env_var = "ANTEATER_MCP_TOKEN"
Codex は接続時に変数を読み取り、Authorization: Bearer <token> を送信します。
その他の MCP クライアント
このサーバーは、stdio 経由で標準の MCP に対応しています。クライアントの接続先を次のように指定してください。
command: node
args: ["/absolute/path/to/anteater-mcp/anteater-mcp.mjs"]
または、node anteater-mcp.mjs --http を実行して、http://127.0.0.1:8787/mcp でストリーミング可能な HTTP サーバーとして起動してください。
プロトコルバージョン 2025-06-18、2025-03-26、2024-11-05 に対応しています。送信されたバージョンをそのまま返すのではなく、サーバーが対応可能な古いバージョンへ調整します。
利用できる機能
ツール(20 個)
授業を探す
| ツール | 回答できること |
|---|---|
search_sections | **主力ツールです。**指定した用語の開講中のクラスを検索します。時間、担当教員、教室、空席数、ウェイトリスト、期末試験を確認できます。曜日の限定フィルター(daysOnly)と、都合の悪い時間帯を除外するフィルター(avoidDays + avoidStart/avoidEnd)に対応しています。「月曜の午後は仕事です」といった条件に使えます |
recommend_courses | **おすすめのツールです。**GE、曜日、時間帯、空席で絞り込み、過去の GPA に基づいて順位付けします |
search_courses | 開講されている授業を検索します |
get_course | 1 つの授業について、説明、前提条件、制限、履修によって選択可能になる授業をすべて確認できます |
get_courses_batch | 既知の授業を最大 50 件まで、詳細情報を任意で含めて一度に比較できます |
list_terms | データがある学期と、学事暦を確認できます |
list_departments | 学科コードを確認できます(CS は COMPSCI に対応します) |
履修前に授業を見極める
| ツール | 回答できること |
|---|---|
get_course_grades | 担当教員別または学期別の成績分布を確認できます — 「どの教授の授業を取るべき?」 |
get_instructor | 教授の担当授業と、実際に付けた成績を確認できます |
get_rmp_ratings | その学期に授業を担当する教員について、Rate My Professors の平均評価、レビュー数、プロフィールへのリンクを確認できます |
get_enrollment_history | 日ごとの定員充足状況を確認できます — 「履修登録できる?」 |
get_syllabi | 過去の開講時のシラバスへのリンクを確認できます — 実際の課題量と成績評価の内訳がわかります |
get_course_materials | ISBN と UCI Library へのリンク付きで、必須および推奨の教科書を確認できます |
実際に履修登録できるかを確認する
| ツール | 回答できること |
|---|---|
check_prerequisites | 修了済みの授業と照らし合わせて、前提条件のツリーを確認します |
check_schedule | 授業時間の重複、期末試験の重複、合計単位数に加え、実際にこの組み合わせで履修登録できるかを確認します — 不足しているディスカッションやラボ、キャンセルまたは満員のクラス、未定の授業時間もチェックします |
get_ap_credit | AP スコアで認められるものを確認できます:単位、GE、履修免除される授業 |
学位取得を計画する
| ツール | 回答できること |
|---|---|
get_program_requirements | 大学全体の GE を含む、学位要件のツリーを確認できます |
check_degree_progress | 修了済みの授業と AP スコアに基づき、学位取得の進捗を確定的に確認します。不確かな規則は未検証として明示します |
list_programs | 専攻、副専攻、専門分野を確認できます |
get_sample_program | カタログで推奨されている学期ごとの履修順序を確認できます |
このうち 5 つのツールは、上流の API が提供していない処理を行います。前提条件ツリーの評価、時間割の重複検出、開講中の時間割と過去の成績データの結合、AP 単位の付与内容の表示、学位取得の進捗の確定的な評価です。
20 個すべてに readOnlyHint: true が注釈されています — ここでデータが変更されることはありません。
プロンプト(6)
Claude Desktop では、これらはスラッシュコマンドとして表示されます。それぞれが単一の検索ではなく、複数のツールを使った一連のワークフローを実行します。
| プロンプト | 引数 | 機能 |
|---|---|---|
plan-quarter | term*、goals | 最初から、競合のない完全なスケジュールを作成します |
pick-professor | course*、term | 成績で教員を比較し、次に実際に授業を担当している教員を確認します |
find-easy-ge | term、ge、constraints | スケジュールに合い、成績の良いGEを見つけます |
check-my-schedule | term、sections | セクションコードについて、時間の競合、単位数、履修登録のリスクを確認します |
can-i-take | course*、completed | APによる代替も含め、履修資格を確認します |
degree-check | major*、completed、apScores | 決定論的な進捗チェックを実行し、残りの履修計画を立てます |
* = 必須です。term、ge、department、major、course という名前の引数は、MCP completions API による自動補完に対応しています。
リソース(4)
クライアントがツール呼び出しを使わずに直接読み取れる参照テーブルです。
anteater://reference/departments— すべての学科コードと名称anteater://reference/terms— スケジュールデータを含むすべての学期anteater://reference/ge-categories— GEコードとその意味anteater://reference/restriction-codes— Registrar による履修制限コード
設定
APIキー
任意ですが、設定をおすすめします。匿名呼び出しは共有の時間あたりのクォータを消費するため、すぐに使い切る可能性があります。キーを設定すれば、自分専用のクォータを利用できます。
ファジー検索が有効になるわけではありません。/v2/rest/search は通常のキーを not permitted to access this resource というエラーで拒否します。この検索には、ICSSC が別途付与する上位の権限が必要です。権限がない場合、search_courses はタイトル、次に説明文に対する部分一致検索にフォールバックし、そのことを出力に示します。構造化フィルター(department、geCategory、courseLevel、単位数)には影響せず、通常はこちらのほうが適しています。
- dashboard.anteaterapi.com/create にアクセスします
- タイプとして
secretを選択します。publishableキーはOriginヘッダーに対して検証されますが、Node はこのヘッダーを送信しないため、ここでは使用できません - クライアント設定にキーを設定するか(上記を参照)、ローカル開発の場合は次のように設定します。
cp .env.example .env # then edit .env
set -a; . ./.env; set +a # load it without echoing the value
.env は gitignore の対象です。キーを Issue、PR、スクリーンショットに貼り付けないでください。
共有および個人用の上流キー(MCPHub)
MCPHub 内で直接実行するには、MCPHub ガイドの stdio 設定をインポートします。各ユーザーは個人用キーを紐付けることができ、別の共有エントリでは公開キー/デフォルトキーを使用します。Anteater コンテナを別途用意する必要はありません。以下のヘッダー方式は HTTP デプロイ用です。
HTTP 呼び出しでは、デプロイ時に設定した共有 ANTEATER_API_KEY と、X-Anteater-Api-Key で送信する個人用キーのどちらも使用できます。個人用ヘッダーは、そのリクエストに関連するすべての並行上流呼び出しを含め、優先して使用されます。ヘッダーがない場合は共有キーが使用されます(共有キーが設定されていなければ、匿名で上流にアクセスします)。空の個人用ヘッダーや曖昧な個人用ヘッダーは拒否されます。無効な個人用キーが共有キーを使って再試行されることはありません。Anteater API のキャッシュは認証情報ごとに分離されています。
Authorization: Bearer <ANTEATER_MCP_TOKEN> は、引き続きこのサーバーへのアクセスを認証します。これは上流 API キーとは独立しており、設定されている場合はどちらのモードでも必要です。個人用キーはヘッダーに設定し、URL のクエリパラメーターには決して含めないでください。
共有サーバーと個人用サーバーの個別のエントリについては、MCPHub のセットアップを参照してください。個人用エントリにはキーの紐付けが必要です。共有エントリは紐付けなしで引き続き利用できます。
環境変数
| 変数 | 用途 |
|---|---|
ANTEATER_API_KEY | 秘密鍵です。上記を参照してください。 |
ANTEATER_API_BASE | デフォルトは https://anteaterapi.com です。セルフホストインスタンスを指定してください。 |
ZOTCOURSE_API_BASE | WebSoc のスケジュールをリアルタイムで照会するための独立したフォールバックです。デフォルトは https://zotcourse.appspot.com です。無効にするには off を設定してください。これを使用するのは search_sections、check_schedule、recommend_courses のみで、フォールバック結果にはキャッシュされている可能性があることが表示されます。 |
ANTEATER_MCP_TOKEN | HTTP モードのみで使用され、サーバーを公開する前に必ず設定してください。クライアントは Authorization: Bearer <token> を送信します。この方法が推奨されます。または、クライアントが URL のみを受け付ける場合は https://host/mcp?token=<token> を使用します。URL 内のトークンは、ブラウザーの履歴、コネクターの設定、プロキシのログに残る可能性があります。/health は認証なしでアクセスできます。未設定の場合は認証されません。これはループバックでのみ安全です。 |
ANTEATER_ALLOWED_ORIGINS | HTTP モードのみ。許可する追加のオリジンをカンマ区切りで指定します。 |
ANTEATER_TRUSTED_PROXIES | HTTP モードのみ。X-Forwarded-* の設定を許可する直接の接続元を指定します。CIDR、アドレスのみの指定、および省略形の private と loopback を使用できます。未設定の場合、ヘッダーは無視されます。ヘッダーはクライアント側から送信できるため、そうしないと誰でもログ上のアドレスを偽装できてしまいます。リバースプロキシの背後で使用する場合はこれを設定してください。設定しないと、すべてのリクエストがプロキシから送信されたように見えます。private は Docker ブリッジを対象にします。 |
HOST / PORT | HTTP モードのみ。--host / --port と同等です。 |
コマンドライン
node anteater-mcp.mjs # stdio (what MCP clients use)
node anteater-mcp.mjs --http # HTTP on 127.0.0.1:8787, endpoint /mcp
node anteater-mcp.mjs --http --port 9000 # different port
node anteater-mcp.mjs --http --host 0.0.0.0 # bind all interfaces (warns; see below)
node anteater-mcp.mjs --list-tools # list every tool
HTTP モードのセキュリティ
- デフォルトでは
127.0.0.1にバインドします。 ホストを指定せずにserver.listen(port)を実行すると、すべてのインターフェースにバインドされ、認証されていないサーバーが LAN 全体に公開されてしまいます。変更するには--hostが必要です。変更時には警告が表示されます。 Originを検証します。 MCP 仕様では、ローカル HTTP サーバーにこの検証が求められています。検証しないと、アクセスしたページからポートに POST して、すべてのツールを操作できてしまいます(DNS リバインディング/CSRF)。Originがないリクエスト(ネイティブ MCP クライアント)は許可されます。Originがあるリクエストは、localhost からのものか、ANTEATER_ALLOWED_ORIGINSに指定されている必要があります。Access-Control-Allow-Originは検証済みの単一のオリジンを返し、*は決して返しません。ANTEATER_MCP_TOKENが設定されていない場合、HTTP リクエストは認証されません。 ループバックでは問題ありませんが、それ以外の場所では安全ではありません。ループバック以外にバインドしていてトークンが設定されていない場合、サーバーは起動時に警告を表示します。DEPLOY.md を参照してください。- HTTP のアクティビティは、1 リクエストにつき JSON のリクエスト行とレスポンス行として stderr に記録されます。 ログにはリクエスト ID、メソッド、無害化されたターゲット、リモートアドレス、ステータス、所要時間、RPC/ツール名、および取得可能な場合は結果が含まれます。認証情報と RPC 引数は記録されません。URL 内のトークン値は
[REDACTED]と表示されます。 /healthはステータスとソース URL を返します。/sourceはこのリポジトリにリダイレクトします。これにより、変更したコピーをデプロイする人が AGPL 第 13 条を遵守しやすくなります。
トラブルシューティング
| 症状 | 原因と対処 |
|---|---|
| Claude Desktop にツールが表示されない | パスは絶対パスで指定し、アプリを完全に終了してから再起動する必要があります。設定ファイルが解析できることを確認してください:node -e "require('./claude_desktop_config.json')"。 |
Anteater API rate limit hit | 匿名利用枠は共有され、1 時間ごとに補充されます。ANTEATER_API_KEY を設定してください。 |
search_courses の結果がおかしい | あいまい検索には、通常のキーでは付与されない特権キーが必要です。特権キーがない場合は部分文字列検索に切り替わり、その旨が表示されます。代わりに構造化フィルターを使用してください。 |
search_sections で Too broad と表示される | 1 学期全体では数万件のセクションがあります。department、courseNumber、ge、instructor、または sectionCodes を追加してください。 |
"2026 summer" is ambiguous と表示される | UCI には夏学期が 3 つあります。Summer1、Summer2、または Summer10wk を使用してください。 |
Unknown department "..." と表示される | list_departments を使用するか、anteater://reference/departments を参照してください。 |
| コースに成績データがない | 直近の学期のデータは反映が遅れることがあり、P/NP のみのコースにはデータがありません。 |
| 空席数が古く見える | 最新の数値は 5 分間、カタログは 24 時間キャッシュされます。 |
| スケジュールのフォールバックが表示される | Anteater API が利用できなかったため、スケジュールの取得元は Zotcourse の WebSoc ベースのエンドポイントです。WebReg で空席数とセクションの組み合わせを確認してください。このネットワークフォールバックを使用しない場合は、ZOTCOURSE_API_BASE=off を設定してください。 |
開発
npm test # 20 conformance tests; makes no API calls
npm run test:live # live calls; needs a key in practice
npm ci # build tooling only; the shipped server has no runtime packages
npm run build:sea # standalone binary; requires the exact Node in .node-version
UPSTREAM.md には、正確な Anteater API のバージョンと、このサーバーがエンドポイントごとに検証された上流コミットが記録されています。API が変更され、結果が誤っていたり空になったりした場合は、ここから確認してください。
VERIFICATION.md はリリース用の完全なチェックリストです。回帰テストの合格基準、セキュリティチェック、統合チェックがまとめられており、コードを読んだことがない人でも実行できるように書かれています。
CI では、Docker とネイティブパッケージングで使用しているものと同じ、固定バージョンの Node 24 LTS リリースを使用します。オフラインテストスイート、構文チェックと OpenAPI チェック、スタンドアロン実行ファイルのスモークテスト、制限されたコンテナーでのプロトコルテストを実行します。意図的に Anteater API へのライブ呼び出しは行わないため、公開レート制限を消費することはありません。
package.json のバージョンに v を付けた文字列と完全に一致するタグをプッシュすると、6 つのネイティブ実行ファイルをビルドし、チェックサムと来歴の証明を生成し、amd64/arm64 イメージを GHCR にプッシュして、GitHub Release を公開します。安定版タグでは :latest が更新され、すべてのリリースで :beta が更新されます。正確な :vX.Y.Z タグは変更されません。
初回のイメージ公開後、GHCR パッケージの公開範囲を一度だけパブリックに設定してください。ワークフローではスコープが限定された GITHUB_TOKEN を使用します。リポジトリのポリシーによってボットが作成する Release がブロックされる場合は、上流プロジェクトのフォールバックと同様に、Contents への書き込み権限を持つきめ細かい RELEASE_PAT シークレットを追加してください。
対象範囲
Anteater API は、食堂、図書館の利用状況、学習室の予約にも対応しています。これらは意図的にラップしていません。このサーバーは、授業の選択と履修登録に専念しています。
LARC の個別指導セクションは対象範囲に含まれますが、上流では実質的に停止しています。/v2/rest/larc は 2024 年秋学期のコースを 22 件返しますが、それ以降の学期には何も返さないため、学生が実際に計画している学期について、ツールは常に「該当なし」と回答することになります。
既知の制限事項
これらは上流データの特性であり、バグではありません。誤った助言を自信たっぷりに提示するよりも、サーバーはこれらの制限を明示します。
- WebSoc では、どのディスカッションがどの講義に属するかは公開されていません。 コースによってはセクション番号に対応関係が含まれています(
Lec A→Dis A1)が、別のコースでは関連するセクションが独立して番号付けされています(I&C SCI 31:講義は A/B、ラボは 1〜9)。そのため、check_scheduleは必須の構成要素が完全に欠けている場合や、組み合わせを確認できない場合を知らせますが、特定のラボが特定の講義に対応しているとは確認できません。WebReg で確認してください。ICSSC 独自のクライアントも、どちらもこの対応関係を推測しません。AntAlmanac と PeterPortal はどちらもセクションをフラットなリストとして表示し、組み合わせの確認は学生に委ねています。これは、対応関係を示すデータ自体が存在しないことの有力な証拠です。 - 履修制限があなたに適用されるかどうかは判定されません。
search_sectionsとrecommend_coursesは制限コードとその意味を表示しますが、「専攻限定」や「大学院生限定」の条件を満たしているかどうかは、教務課が判定します。 - 編入単位やコミュニティカレッジでの履修科目は含まれていません。
check_prerequisitesは、認識できない修了済み科目を黙って無視せずに報告しますが、編入単位を認定できるのはアドバイザーだけです。 - 履修登録期間の日付はありません。 学事暦には授業期間と期末試験期間が記載されていますが、履修登録期間の開始日は記載されていません。StudentAccess で確認してください。
- 成績データには遅れがあります。 直近のクォーターのデータがない場合があり、最近の学期の成績が
STAFF名義で登録されていることもよくあります。サンプル数が少ないと平均 GPA の信頼性は低くなります。ツールは常にnを表示するので、信頼性を判断できます。 - 過去の GPA はコース全体の平均です。
recommend_coursesは過去のすべての担当教員の平均に基づいて順位付けしますが、その教員が今学期の担当教員とは限りません。決める前にget_course_gradesを使って担当教員ごとの成績を確認してください。
リリース前に発見して修正したバグ
6つの観点(ロジック、MCP 準拠、ライブ API 契約、セキュリティ、堅牢性、リポジトリの準備状況)から並行レビューを行い、修正前に41件、重複を除いて38件の指摘がありました。実際に利用者を誤解させていたであろう問題は次のとおりです。
| バグ | 影響 |
|---|---|
単独の null JSON-RPC メッセージでプロセスが停止する | どちらのトランスポートでも発生します。HTTP では、認証不要の4バイトのサービス拒否攻撃になります。 |
| すべての期末試験日が1か月早かった | WebSoc の finalExam.month は0始まり(11 = 12月)ですが、コードでは1始まりとして扱っていました。「Tue Nov 8」は実際には12月8日です。利用者が誤った日にフライトを予約する可能性があります。 |
| 19個の制限コードのうち7個が誤っていた | K は「Cross-listed(複数の科目番号で開講)」と表示されていましたが、実際は大学院生限定で、1学期だけで608回使われています。X は「Separate final exam(期末試験が別)」と表示されていましたが、実際は、履修取り消しにも許可コードが必要という意味です。 |
"2026 Summer 1" を指定すると、何も通知されず Spring が返る | s の単独エイリアスが summer に優先して一致していました。6学期のうち3学期を自然な表現では取得できず、自信ありげに、まったく誤った時間割が返されていました。 |
| 単独のラボ科目の単位数が0として数えられる | check_schedule は Lab セクションを除外していたため、講義のない CHEM 1LD(3単位)が集計から抜けていました。学生が、学資援助や F-1 の在留資格の条件となるフルタイムの12単位を誤って判断するおそれがありました。 |
recommend_courses が sectionType: Lec を強制する | セミナーのみの GE がすべて見えなくなり、GE-1A では何も返されませんでした。 |
ugrad を指定して get_program_requirements を呼び出すと必ず失敗する | エンドポイントでは必須の id パラメーターが必要でしたが、ツールから送信されていませんでした。 |
HTTP モードで Origin を検証せずに 0.0.0.0 にバインドする | 「localhost で待ち受け中」とログに表示しながら、実際にはすべてのネットワークインターフェースにバインドしていました。 |
| Fall がその年で最も早い学期として並べ替えられる | get_enrollment_history と get_course_grades の時系列が逆になっていました。 |
2回目のレビューでは、現実的な学生のシナリオを6件想定し、サーバーを最初から最後まで動作させたところ、さらに54件の問題が見つかり、そのうち10件は重大な障害でした。特に深刻なものは次のとおりです。
| バグ | 影響 |
|---|---|
check_schedule が、履修できない時間割を問題なしと判定する | 時間だけをチェックしていました。必須のラボがない講義や、満員またはキャンセル済みのセクションも黙って合格となり、学生は WebReg で履修を拒否されます。 |
days が「指定日のうち少なくとも1日に授業がある」という意味になっている | 火曜と木曜だけ出席できる学生にも、週3日または4日の授業や、必須ラボがすべて月・水・金にある科目が表示されていました。 |
| 教員の姓だけを指定しても一致しない | get_course_grades は、その教員に1,642件の成績記録があるにもかかわらず、科目に問題があると判断し、「新しい科目か、P/NP 評価のみの可能性があります」と表示していました。 |
| 学位要件が2023~2024年度のカタログを既定で使用する | 2026~2027年度の学生に対して3年古い要件が表示され、古い情報であることも示されていませんでした。 |
check_prerequisites が認識できない科目を黙って除外する | そのうえで、学生が実際に履修済みの科目について、自信ありげに「NOT satisfied」と表示していました。 |
recommend_courses が制限コードを表示しない | 最も高い順位で推薦された GE 科目を、学生が履修できないことがありました。 |
check_schedule が生の TypeError を送出する | 同じパラメーター名について search_sections の説明にある、カンマ区切りの文字列を渡すと発生していました。 |
そのほか、NOT の前提条件サブツリーでチェックマークが逆になる問題、スペースを含む48個の学科コードで科目番号が失われる問題、HTTP のチャンク境界でマルチバイト UTF-8 が破損する問題、未検証の入力に対して二次的なバックトラッキングを起こす正規表現、socAvailable が時間割の公開日であるにもかかわらず「履修登録開始日」と誤表示される問題も修正しました。
知っておくと便利な API の癖
上流のドキュメントには記載されていませんが、ここではすべて対応しています。デバッグに役立つ場合に備えて記載します。
daysはカンマ区切りにする必要があります。Tu,Thは機能しますが、TuThは拒否されます。指定した曜日の少なくとも 1 つに一致し、すべてに一致するわけではありません。enrollmentHistoryはスカラー値ではなく、並列配列を返します(dates[]、totalEnrolledHistory[]、requestedHistory[]など)。-1は「追跡されていない」ことを意味します。finalExam.monthは 0 始まりです。- コースのコメントは生の HTML フラグメントで、
<p>や"も含まれます。 startTime/endTimeは「開始時刻が指定時刻以降」「終了時刻が指定時刻以前」を意味し、時間帯の重複を意味するわけではありません。/v2/rest/searchには 特権付き API キーが必要です。 通常のキーではnot permitted to access this resourceとして拒否されます。これは、キーがまったくない場合に表示されるkey is requiredとは別のエラーです。すでにキーを持っている人にキーを取得するよう伝えても行き詰まるため、この違いを把握しておくと便利です。- **
/v2/rest/websoc/syllabiが受け取るのはcourseId**であり、departmentとcourseNumberではありません。 /v2/rest/courseMaterialsにはdepartmentとcourseNumberの両方が必要です。 どちらか一方だけでは拒否され、夏の 3 つのセッションは単一のSummerにまとめられます。- 制限の文字列には文章が含まれます。
"A and N"は空白で分割し、文字どおりのand/orも取り除く必要があります。そうしないと、接続詞がコードとして表示されます。 - セクションのステータスは自由記述ではなく列挙値です:
OPEN、Waitl、FULL、NewOnly、または空です。継続在学生が今すぐ登録できるのはOPENの場合だけです。NewOnlyは新入生向けに確保された席を示します。numNewOnlyReservedは、同じ方法で確保された定員内の席数を示すため、見かけ上の空席数は実際の空席数より多くなります。
配布
MCP Registry に io.github.KKazuhaK/anteater-mcp として公開されており、コンテナイメージのみを掲載しています。レジストリエントリには独自のインスタンスの実行方法が記載されています。ホスト型インスタンスはそれぞれ独自のトークンで保護され、その上流クォータは実行者に属するため、他者のデプロイ先にはリンクしていません。
各リリースでは、GHCR イメージと 6 つのプラットフォーム向けのスタンドアロンバイナリも公開されます。
ライセンスと帰属表示
データは ICSSC Projects が保守する Anteater API から取得しています。
これは UCI の公式ツールではありません。 登録前に WebReg または General Catalogue で確認してください。利用には Anteater API の帰属表示ポリシーが適用されます。
上流の Anteater API サーバーと同じ AGPL-3.0-or-later ライセンスを採用しています。これにより、将来このプロジェクトが上流に取り込まれる場合、コードを双方向に自由に移動できます。これは独立した HTTP クライアントであり、上流のソースコードは含まれていません。このプロジェクトを変更してネットワークサービスとして実行する場合、AGPL 第 13 条により、ユーザーに Corresponding Source を提供する必要があります。詳しくは NOTICE を参照してください。
学術利用の場合:
@misc{anteater-api,
author = {ICS Student Council},
title = {Anteater API},
year = {2024},
howpublished = {\url{https://github.com/icssc/anteater-api}},
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。