关于 Anteater MCP
Anteater MCP 面向 UC Irvine 学生,利用实时课程安排、历史成绩、先修要求和学位要求来搜索课程并规划选课。除课程查询外,还提供排课冲突和学位进度检查。
主要功能
- 01实时查询课程班次并推荐课程
- 02查看历史成绩与选课趋势
- 03检查先修要求和排课冲突
- 04评估 AP 学分与学位进度
- 05提供 6 个引导式提示词和 4 项参考资源
适用场景
- 01按时间条件查找有空位的班次
- 02依据教师历史成绩比较课程
- 03检查拟定课表是否存在冲突
- 04根据已修课程和 AP 成绩核对学位要求
MCP 相关
这是一个 MCP 服务,向 MCP 客户端提供 20 个工具、6 个引导式提示词和 4 项参考资源。支持 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 托管使用的可选按请求上游密钥,并采用凭据隔离缓存。 如果未设置密钥,共享服务仍支持使用匿名上游配额。
一个 MCP 服务,让 Claude 和 ChatGPT 帮你选择 UC Irvine 的课程。
它封装了 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 Release 都包含适用于 Linux、macOS 和 Windows 的原生压缩包,支持 amd64 和 arm64,另附 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
有两种方式。第一种无需服务器。
A. 使用 Actions 的自定义 GPT — 无需托管
- ChatGPT → 探索 GPT → 创建 → 配置 → 创建新操作
- 将
gpt-actions-openapi.json的内容粘贴到 Schema 框中 - 身份验证 — 有两种可行的选择:
- 无。 Anteater API 可匿名读取。最简单,但你要与所有其他匿名调用者共享全局每小时配额,并且会遇到 429 错误。
- API Key → Auth Type: Bearer,并填写你的 Anteater API 密钥。ChatGPT 随后会在每次调用时发送
Authorization: Bearer <key>,你也会获得自己的配额。⚠️ 密钥会随 GPT 一同保存,因此与你共享该 GPT 的任何人都会使用你的密钥。用于私人 GPT 没问题;请勿发布包含你密钥的 GPT。
- 将
gpt-instructions.md粘贴到 Instructions 框中
该 GPT 会直接调用 anteaterapi.com。12 项操作涵盖课程、WebSoc、成绩、选课历史和学位要求。
**取舍:**GPT 收到的是原始 JSON。WebSoc 响应有四层嵌套(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 支持的两种传输方式,即 SSE 和流式 HTTP,均已实现。如需永久部署而非使用隧道,请参阅 DEPLOY.md — 设置方式与 Claude 相同,仅连接器界面有所不同。
⚠️ 如果没有
ANTEATER_MCP_TOKEN,该端点将不受身份验证保护。公开任何内容前请设置该变量。请参阅 HTTP 模式安全性。
⚠️ **ChatGPT 的 MCP 插件仅支持网页端。**OpenAI 自己的文档指出,开发者模式“适用于 Pro、Plus、Business、Enterprise 和 Education 账户,且仅限网页端”——手机应用无法连接 MCP 服务。要在手机上使用 ChatGPT,请使用自定义 GPT,并将其 Action 指向此服务的 REST 门面,下文会对此进行介绍。
不同 ChatGPT 方式的功能对比
| 自定义 GPT + Actions | 开发者模式 + MCP | |
|---|---|---|
| 是否需要服务器 | 否 | 是,公开的 HTTPS 服务 |
| 身份验证选项 | 无 · API Key(Basic/Bearer/自定义请求头)· OAuth | 使用 Bearer、Basic 或自定义请求头方案的访问令牌 / API 密钥 · OAuth · 无。Claude 的连接器对话框也支持填写请求头,因此 ?token= 仅是备用方案 |
| 能否使用你的 Anteater 密钥 | 可以,使用 API Key → Bearer | 可以,通过服务器端的 ANTEATER_API_KEY |
| 模型可获取的内容 | 12 项原始 API 操作,JSON | 全部 20 个工具,格式化内容,另有 6 个提示词和 4 个资源 |
| 先修课 / 冲突检查 | 否 — 模型必须自行推理 | 可以 |
| 是否支持移动端 | 是 | 否 — MCP 插件仅支持网页端 |
在手机上
Claude 的 iOS 和 Android 应用支持远程 MCP 服务。将此服务部署在 HTTPS 后面, 在浏览器中于 claude.ai 添加一次,即可同步到应用中 — 你无法直接通过手机添加新 服务。DEPLOY.md 提供了完整方案:令牌身份验证、systemd 单元、 Caddy 或 nginx,以及连接器设置。
ChatGPT 自定义 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 客户端
此服务通过标准输入/输出使用标准 MCP。将客户端指向:
command: node
args: ["/absolute/path/to/anteater-mcp/anteater-mcp.mjs"]
或者使用 node anteater-mcp.mjs --http,将其作为可流式传输的 HTTP 服务运行在
http://127.0.0.1:8787/mcp。
协议版本 2025-06-18、2025-03-26 和 2024-11-05 均受支持;
服务会协商到较低版本,而不会原样返回收到的版本。
你可以获得什么
工具(20 个)
查找课程
| 工具 | 可解答的问题 |
|---|---|
search_sections | 主力工具。 查询某个术语的实时课程班级信息:上课时间、教师、教室、剩余名额、候补名单、期末考试。支持仅限指定上课日的筛选条件(daysOnly),以及排除时间段的筛选条件(avoidDays + avoidStart/avoidEnd),可用于“我周一下午要上班”这类需求 |
recommend_courses | 你最想要的工具。 按 GE、上课日、时间段和剩余名额筛选,并根据历史 GPA 排序 |
search_courses | 查询所有开设的课程 |
get_course | 查看一门课程的完整信息:课程简介、先修要求、限制条件及其可解锁的内容 |
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 图书馆链接 |
确认自己确实可以选课
| 工具 | 可解答的问题 |
|---|---|
check_prerequisites | 根据你已完成的课程,逐层检查先修课程树 |
check_schedule | 检查上课时间冲突、期末考试冲突、总学分,以及能否实际选上这些课程 — 包括缺少讨论课/实验课、已取消或已满的课程班级,以及待定的上课时间 |
get_ap_credit | 查看 AP 成绩可兑换的内容:学分、GE、可免修课程 |
规划学位
| 工具 | 可解答的问题 |
|---|---|
get_program_requirements | 查看学位要求树,包括全校通用的 GE 要求 |
check_degree_progress | 根据已完成课程和 AP 成绩确定性地检查进度;对于不确定的规则,会明确标记为未经验证 |
list_programs | 查看专业、辅修和专业方向 |
get_sample_program | 查看课程目录推荐的逐季度修读顺序 |
其中有五个工具可以计算上游 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— 注册处提供的选课限制代码
配置
API 密钥
可选,但建议配置:匿名调用使用共享的每小时配额,很容易耗尽;配置密钥后则可使用专属配额。
它不会解锁模糊搜索。/v2/rest/search 会拒绝普通密钥,并返回 not permitted to access this resource——它需要 ICSSC 单独授予的更高权限。未配置该权限时,search_courses 会退回到按标题、再按描述进行子串匹配,并会在输出中说明这一点。结构化筛选条件(department、geCategory、courseLevel、units)不受影响,而且通常更实用。
- 前往 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 查询参数。
有关单独的 Shared 和 Personal 服务条目,请参阅 MCPHub 设置。Personal 条目需要绑定;Shared 条目即使未绑定也可使用。
环境变量
| 变量 | 用途 |
|---|---|
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>(首选),也可使用 https://host/mcp?token=<token>,适用于客户端只接受 URL 的情况。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)会绑定所有 网络接口,从而将未经身份验证的服务暴露给整个局域网。必须使用--host才能更改此设置,更改时会显示警告。 - 验证
Origin。 MCP 规范要求本地 HTTP 服务执行此验证: 否则,你访问的任何页面都可以向你的端口发送 POST 请求并调用所有工具(DNS 重绑定/CSRF)。允许没有Origin的请求(原生 MCP 客户端); 带有Origin的请求必须来自 localhost,或列在ANTEATER_ALLOWED_ORIGINS中。 Access-Control-Allow-Origin会回显单个已验证的来源,绝不会是*。- 除非设置了
ANTEATER_MCP_TOKEN,否则不进行身份验证。 这在回环地址上没问题, 在其他任何地址上都不安全;如果服务绑定到非回环地址但未设置令牌,启动时会发出警告。 参见 DEPLOY.md。 - HTTP 活动会写入 stderr,每个请求和响应各记录一行 JSON。
日志包含请求 ID、方法、净化后的目标、远程地址、状态、耗时、
RPC/工具名称,以及可用时的结果。绝不会记录授权值和 RPC 参数;URL 中的令牌值会显示为
[REDACTED]。 /health会报告状态和源 URL;/source会重定向到此代码库, 帮助部署了修改版副本的任何人遵守 AGPL 第 13 节。
故障排查
| 症状 | 原因和解决方法 |
|---|---|
| Claude Desktop 中未显示工具 | 路径必须是绝对路径,并且必须完全退出应用后重新打开。检查配置是否能解析:node -e "require('./claude_desktop_config.json')"。 |
Anteater API rate limit hit | 匿名配额由所有人共享,每小时补充一次。设置 ANTEATER_API_KEY。 |
search_courses 返回奇怪的结果 | 模糊搜索需要普通密钥无法获准使用的特权密钥;它会回退到子字符串匹配,并说明这一点。请改用结构化筛选条件。 |
search_sections 返回 Too broad | 一个学期有数万条课程小节。添加 department、courseNumber、ge、instructor 或 sectionCodes。 |
"2026 summer" is ambiguous | UCI 有三个夏季学期。请使用 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,因此绝不会消耗公共速率限制配额。
推送一个标签名与 v 加 package.json 版本号完全匹配的标签后,工作流会构建六个原生可执行文件、生成校验和及来源证明,将 amd64/arm64 镜像推送到 GHCR,并发布 GitHub Release。稳定标签会更新 :latest;每个发布都会更新 :beta;精确的 :vX.Y.Z 标签不可变。
首次发布镜像后,将 GHCR 软件包的可见性设置为公开即可。工作流使用范围受限的 GITHUB_TOKEN;如果仓库策略阻止机器人创建 Release,请添加具有 Contents 写入权限的细粒度 RELEASE_PAT 密钥,作为与上游项目相同的备用方案。
范围
Anteater API 还提供餐厅、图书馆客流和自习室预订服务。这里有意不封装这些功能 — 本服务专注于选课和注册课程。
LARC 辅导课程小节属于范围内,但实际上上游已不再提供:/v2/rest/larc 对 2024 Fall 返回 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查看具体授课教师的成绩。
发布前发现并修复的错误
六维并行审查(逻辑、MCP 一致性、实时 API 契约、安全性、稳健性、仓库就绪情况)共发现 41 个原始问题,去重后为 38 个。以下是那些确实可能误导用户的问题:
| 错误 | 后果 |
|---|---|
单独的 null JSON-RPC 消息会导致进程崩溃 | 两种传输方式都受影响。通过 HTTP,这会造成无需身份验证的 4 字节拒绝服务。 |
| 所有期末考试日期都提前了一个月 | WebSoc 的 finalExam.month 是 从 0 开始索引(11 = 12 月);代码却将其当作从 1 开始索引。“Tue Nov 8” 实际上是 12 月 8 日——有人会订错机票日期。 |
| 19 个限制代码中有 7 个错误 | K 被标为“交叉列出”,但实际表示仅限研究生,而且单个学期就出现了 608 次。X 被标为“单独的期末考试”,但实际表示即使要退课也需要授权码。 |
"2026 Summer 1" 会悄无声息地返回 Spring | 单独的 s 别名吞掉了 summer。六个学季中有三个无法通过自然表达检索到,而且结果会自信地返回完全错误的课表。 |
| 独立开设的实验课被计为 0 学分 | check_schedule 排除了 Lab 课程,因此 CHEM 1LD(3 学分,没有讲座)被忽略——学生可能误判是否达到 12 学分的全日制门槛,而该门槛会影响经济援助和 F-1 身份。 |
recommend_courses 强制使用 sectionType: Lec | 仅以研讨课形式开设的 GE 都无法显示;GE-1A 完全没有返回结果。 |
使用 ugrad 调用 get_program_requirements 总是失败 | 该端点要求提供 id 参数,但工具没有发送。 |
HTTP 模式绑定到 0.0.0.0,却没有验证 Origin | 日志却显示“正在 localhost 上监听”。 |
| Fall 被排在当年的最早学期 | 颠倒了 get_enrollment_history 和 get_course_grades 中的时间顺序。 |
第二轮审查通过六种真实的学生场景端到端调用服务,又发现了 54 个问题,其中 10 个属于阻断级问题。最严重的包括:
| 错误 | 后果 |
|---|---|
check_schedule 对无法选课的课表给出了“全部通过” | 它只检查时间。缺少必修实验课的讲座,或已满额、已取消的课程,都能悄无声息地通过——学生会在 WebReg 被拒。 |
days 表示“至少在其中一天上课” | 只能在周二/周四上课的学生会看到每周上三天或四天的课程,以及所有必修实验课都在周一、周三、周五的课程。 |
| 只输入教师姓氏时,匹配不到任何结果 | get_course_grades 将问题归咎于课程——称其“可能是新课,或只按 P/NP 评分”——但该教授已有 1,642 条成绩记录。 |
| 学位要求默认使用 2023–2024 学年目录 | 对于 2026–2027 学年的学生,数据已过时三年,而且没有任何提示。 |
check_prerequisites 会悄无声息地忽略无法识别的课程 | 随后却自信地提示这些学生实际修过的课程“不满足”要求。 |
recommend_courses 隐藏了限制代码 | 排名最高的 GE 推荐课程,学生可能无法选修。 |
check_schedule 会抛出原始 TypeError | 当参数传入逗号分隔的字符串时就会出错,而 search_sections 对同名参数的文档说明正是这种格式。 |
还修复了:NOT 先修条件子树中反转的勾选标记;48 个含空格的院系代码对应的课程编号丢失;HTTP 分块边界处多字节 UTF-8 字符损坏;对未经验证的输入使用会导致二次回溯的正则表达式;以及将 socAvailable 错误标为“开放选课时间”,而它实际表示课表发布日期。
值得了解的 API 特性
上游文档未说明;这里都已处理,并列出如下,或许能帮你省去调试的麻烦。
days必须用逗号分隔。Tu,Th可用,TuTh会被拒绝。它表示匹配所列日期中的 至少一天,而非全部日期。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。 单独提供其中一个会被拒绝,而且它会将三个夏季学期合并为一个Summer。- 限制条件字符串包含普通文本。
"A and N"必须按空白字符拆分,并且丢弃字面上的and/or,否则连词会被渲染成代码。 - 课程状态是枚举值,而非自由文本:
OPEN、Waitl、FULL、NewOnly或空值。只有OPEN表示在读学生现在可以选课——NewOnly表示名额留给新生。numNewOnlyReserved统计的是容量内同样预留的名额,因此表面上的空余名额会高估实际可选名额。
分发
已发布到 MCP Registry,名称为
io.github.KKazuhaK/anteater-mcp,仅列出容器镜像。注册表条目说明了如何运行自己的实例;它不会指向任何人的部署,因为托管实例需要通过各自的令牌访问,上游配额也归运行该实例的人所有。
每个版本还会发布 GHCR 镜像,以及适用于六个平台的独立二进制文件。
许可证与署名
数据来自由 ICSSC Projects 维护的 Anteater API。
这不是 UCI 的官方工具。 注册前请在 WebReg 或 General Catalogue 中核实。使用须遵守 Anteater API 的 署名政策。
采用 AGPL-3.0-or-later 许可,与上游 Anteater API 服务保持一致,以便将来如贡献回上游,代码可以自由地双向流动。这是一个独立的 HTTP 客户端,不包含任何上游源代码。如果你修改它并将其作为网络服务运行,AGPL 第 13 条要求你向用户提供对应源代码——请参阅 NOTICE。
学术用途:
@misc{anteater-api,
author = {ICS Student Council},
title = {Anteater API},
year = {2024},
howpublished = {\url{https://github.com/icssc/anteater-api}},
}
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。