
Anteater MCP
io.github.KKazuhaK由 GitHub 账号 KKazuhaK 发布v1.0.0-beta.3更新于 Oct 30, 2026
UCI course search and registration planning: live sections, grades, prerequisites, conflicts.
概览
让助手查询加州大学欧文分校课程、比较成绩与教授,并规划无冲突学期课表的 MCP 服务器。
- 可以做什么
- 按学期、星期、时间段、GE 类别和余位搜索实时课堂与课程,查看单门课程或一次批量比较最多 50 门
- 依据成绩分布、Rate My Professors 评分、选课人数历史、教学大纲和教材比较教授与课程
- 检查先修要求、上课与期末考试冲突、总学分以及 AP 学分
- 规划学位:专业要求树、确定性的进度检查、示例培养方案,以及院系和学期参考表
- 运行 plan-quarter、pick-professor、find-easy-ge、degree-check 等引导式提示词
- 适用场景
- 适合 UCI 学生或学业顾问,让助手筛选课程、按历史成绩比较教授、核实一组课堂是否可注册,或检查学位进度。与加州大学欧文分校选课无关的场景不适用。
- 运行要求
- 以 stdio 方式在本地运行,需要 Node 24 LTS,或使用 Linux/macOS/Windows 独立可执行文件,或 Docker 镜像。Anteater API 密钥可选但建议配置;匿名调用共享全球每小时配额。HTTP 模式在暴露到回环地址之外前必须设置 ANTEATER_MCP_TOKEN。需要能访问 Anteater API 的网络。
安装
在 SourceWeft 中
- 打开 控制台中的 Anteater MCP,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
Anteater MCP
Release 1.0.0-beta.3 returns structured error codes from every tool and from the REST facade, so clients can tell a rejected API key from a rate limit or an upstream outage. See Changes for the REST response change.
An MCP server that lets Claude and ChatGPT help you pick classes at UC Irvine.
It wraps Anteater API — UCI's course catalogue, the live schedule of classes (WebSoc), historical grade distributions, enrollment history, prerequisite trees, AP credit, degree requirements and supplementary RMP ratings — and exposes them as 20 tools, 6 guided prompts and 4 reference resources, shaped around the questions students actually ask.
Zero runtime dependencies. Run the source with Node 24 LTS, or download a standalone Linux, macOS or Windows executable that already contains the same Node runtime.
Quickstart
Then add it to your client — Claude Desktop, Claude Code, ChatGPT, or any other MCP client.
Nothing else is required. An API key is optional but recommended.
Installing
Standalone binary
Each GitHub Release contains native
archives for Linux, macOS and Windows on amd64 and arm64, plus SHA256SUMS.txt. These do
not require Node.js:
In an MCP client configuration, use the absolute path to anteater-mcp (or
anteater-mcp.exe) as command and omit the args array. macOS archives are ad-hoc
signed; public Developer ID signing and notarization are not yet configured.
Docker
The published image supports Linux amd64 and arm64. Docker Desktop on macOS and Windows runs the same Linux image:
The Compose service is non-root, read-only, capability-free and bound to loopback by default. See DEPLOY.md before placing it behind public HTTPS.
Claude Desktop
Open the config file:
Add an anteater entry. The path must be absolute — Claude Desktop does not run the
server from your project directory:
With an API key:
Restart Claude Desktop completely (quit, don't just close the window). You should see 20 anteater tools, and the 6 prompts appear as slash commands.
claude_desktop_config.example.json in this repo is the same thing, ready to copy.
Claude Code
With a key:
Verify with claude mcp list.
ChatGPT
Two routes. The first needs no server.
A. Custom GPT with Actions — no hosting required
- ChatGPT → Explore GPTs → Create → Configure → Create new action
- Paste the contents of
gpt-actions-openapi.jsoninto the Schema box - Authentication — two workable choices:
- None. Anteater API is readable anonymously. Simplest, but you share a global hourly quota with every other anonymous caller and will hit 429s.
- API Key → Auth Type: Bearer, with your Anteater API key. ChatGPT then sends
Authorization: Bearer <key>on every call and you get your own quota. ⚠️ The key is stored with the GPT, so anyone you share the GPT with uses your key. Fine for a private GPT; do not publish one with your key in it.
- Paste
gpt-instructions.mdinto the Instructions box
The GPT calls anteaterapi.com directly. Twelve operations cover courses, WebSoc,
grades, enrollment history and degree requirements.
The trade-off: the GPT receives raw JSON. WebSoc responses nest four levels deep
(schools > departments > courses > sections), so broad queries get truncated by
Actions — the supplied instructions tell it to always narrow. Prerequisite evaluation
and conflict detection are not available; the model has to reason them out itself.
B. Host the MCP server — full functionality
ChatGPT's Developer Mode connector needs a public HTTPS MCP endpoint:
Add the URL under Settings → Connectors → Advanced → Developer mode. All 20 tools work, including batch course lookup, deterministic degree-progress checks, prerequisite checking and conflict detection.
ChatGPT's developer mode supports OAuth, no authentication, or mixed — there is no field for a custom header, so put the token in the URL query string:
This URL form is a compatibility option, not a security improvement: URLs may be saved in connector settings and reverse-proxy logs. Use a Bearer header whenever the client supports one.
Both transports ChatGPT accepts, SSE and streaming HTTP, are implemented. For a permanent deployment rather than a tunnel, follow DEPLOY.md — the setup is identical to the Claude one, only the connector UI differs.
⚠️ Without
ANTEATER_MCP_TOKENthe endpoint is unauthenticated. Set it before exposing anything. See HTTP mode security.
⚠️ ChatGPT's MCP plugins are web-only. OpenAI's own documentation says developer mode is "available to Pro, Plus, Business, Enterprise, and Education accounts on the web" — the phone apps cannot reach an MCP server. For ChatGPT on a phone, use a Custom GPT whose Action points at this server's REST facade, described below.
Which ChatGPT route gets you what
On your phone
Claude's iOS and Android apps support remote MCP servers. Deploy this behind HTTPS, add it once on claude.ai in a browser, and it syncs to the apps — you cannot add a new server from the phone itself. DEPLOY.md has a complete recipe: token auth, a systemd unit, Caddy or nginx, and the connector setup.
The ChatGPT Custom GPT route also works on mobile and needs no server at all.
Codex
Codex speaks streamable HTTP and reads the token from an environment variable, so it never lands in a config file:
Or write it to ~/.codex/config.toml directly — a project-local .codex/config.toml
takes precedence over the global one:
Codex reads the variable at connect time and sends Authorization: Bearer <token>.
Any other MCP client
The server speaks standard MCP over stdio. Point your client at:
Or run it as a streamable-HTTP server at http://127.0.0.1:8787/mcp with
node anteater-mcp.mjs --http.
Protocol versions 2025-06-18, 2025-03-26 and 2024-11-05 are all accepted;
the server negotiates down rather than echoing whatever it is sent.
What you get
Tools (20)
Finding classes
Judging a class before you take it
Checking you can actually enrol
Planning a degree
Five of these compute things the upstream API does not provide: prerequisite-tree evaluation, schedule conflict detection, the join between the live schedule and historical grade data, AP-grant rendering, and deterministic degree-progress evaluation.
All 20 are annotated readOnlyHint: true — nothing here mutates anything.
Prompts (6)
In Claude Desktop these appear as slash commands. Each one drives a full multi-tool workflow rather than a single lookup.
* = required. Arguments named term, ge, department, major and course offer
autocomplete through the MCP completions API.
Resources (4)
Reference tables your client can read directly, without spending a tool call:
anteater://reference/departments— every department code and nameanteater://reference/terms— every term with schedule dataanteater://reference/ge-categories— GE codes and what they meananteater://reference/restriction-codes— enrollment restriction codes, per the Registrar
Configuration
API key
Optional, but recommended: anonymous calls draw on a shared hourly quota that is easy to exhaust, and a key gives you your own.
It will not unlock fuzzy search. /v2/rest/search rejects ordinary keys with
not permitted to access this resource — it needs elevated permission ICSSC grants
separately. Without it search_courses falls back to substring matching on title, then
description, and says so in its output. The structured filters (department,
geCategory, courseLevel, units) are unaffected and are usually the better tool
anyway.
- Go to dashboard.anteaterapi.com/create
- Choose type
secret—publishablekeys are verified against theOriginheader, which Node does not send, so they will not work here - Either set it in your client config (see above), or for local development:
.env is gitignored. Never paste a key into an issue, PR or screenshot.
Shared and personal upstream keys (MCPHub)
For direct execution inside MCPHub, import the stdio configuration in the MCPHub guide. Each user can bind a personal key, and a separate shared entry uses the public/default key. No independent Anteater container is required. The following header mechanism is for HTTP deployments.
HTTP calls can use either the deployment's shared ANTEATER_API_KEY or a personal
key sent as X-Anteater-Api-Key. The personal header takes precedence for that
request, including all of its concurrent upstream calls. If the header is absent,
the shared key is used (or anonymous upstream access if no shared key is configured).
A blank or ambiguous personal header is rejected; an invalid personal key never
retries with the shared key. Anteater API caches are separated by credential.
Authorization: Bearer <ANTEATER_MCP_TOKEN> still authenticates access to this
server. It is independent of the upstream API key and is required for both modes
when configured. Personal keys belong in headers, never URL query parameters.
See MCPHub setup for separate Shared and Personal server entries. Personal entries require a binding; Shared remains available without one.
Environment variables
Command line
HTTP mode security
- Binds
127.0.0.1by default.server.listen(port)with no host binds every interface, which would expose an unauthenticated server to the whole LAN.--hostis required to change that, and it warns when you do. - Validates
Origin. The MCP specification requires this of local HTTP servers: without it, any page you visit can POST to your port and drive every tool (DNS rebinding / CSRF). Requests with noOrigin— native MCP clients — are allowed; requests with one must be localhost or listed inANTEATER_ALLOWED_ORIGINS. Access-Control-Allow-Originechoes the single validated origin, never*.- Unauthenticated unless
ANTEATER_MCP_TOKENis set. That is fine on loopback and not fine anywhere else; the server warns at startup if it is bound off-loopback without one. See DEPLOY.md. - HTTP activity is logged to stderr as one JSON request line and one response line.
Logs include a request ID, method, sanitized target, remote address, status, duration,
RPC/tool name, and outcome when available. Authorization values and RPC arguments are
never logged; URL token values are shown as
[REDACTED]. /healthreports status and the source URL;/sourceredirects to this repository, which helps anyone deploying a modified copy comply with AGPL section 13.
Errors
A failed tool call returns isError: true and a single text content item holding a JSON
object, so a client can tell a bad credential from a service outage without parsing prose:
message stays human-readable and is safe to show to a user; it never contains the API
key. Codes are stable; wording is not.
The REST facade (/tools/<name>) keeps HTTP 200 with {"result": ..., "isError": true} for
a tool failure. result is the same JSON string as the MCP text, and a top-level
"error": "<CODE>" repeats the code. Transport problems keep their HTTP status but now
share one body shape, {"error": "<CODE>", "message": "<text>"}, with error one of
INVALID_ARGUMENT (400), UNAUTHORIZED (401), NOT_FOUND (unknown tool, 404),
METHOD_NOT_ALLOWED (405) or PAYLOAD_TOO_LARGE (413). A failing resources/read
keeps JSON-RPC error -32603 and adds data: {"error": "<CODE>"}. All of this is
described in /openapi.json. The static gpt-actions-openapi.json talks to Anteater API
directly and is unaffected.
Changes
1.0.0-beta.3
- Tool failures are now structured. The text content of an
isErrorresult is a JSON object{"error": CODE, "message": text}instead ofError: ...prose. Codes:CREDENTIAL_INVALID,PERMISSION_DENIED,RATE_LIMITED,INVALID_ARGUMENT,SOURCE_UNAVAILABLE. - REST facade
resultformat change. On failure,/tools/<name>still returns HTTP 200 withisError: true, butresultis now that JSON string rather thanError: ...prose, and a top-levelerrorcode is added. Transport errors (400, 401, 404, 405, 413) now return{"error": CODE, "message": text}where some returned plain text or{"error": text}. Match onerror, not on the oldError:prefix. - New
ANTEATER_API_KEY_SCOPE(operatordefault, oruser). get_course,check_prerequisitesno longer report an upstream outage or rate limit as "No course ...": only a real 404 does.
Troubleshooting
Development
UPSTREAM.md records the exact Anteater API version and the upstream commits this server was validated against, endpoint by endpoint — start there when the API changes and something begins returning wrong or empty results.
VERIFICATION.md is a full release checklist — per-regression pass criteria, security checks and integration checks — written so someone who has never read the code can run it.
CI uses the same pinned Node 24 LTS release as Docker and native packaging. It runs the offline suite, syntax and OpenAPI checks, a standalone-executable smoke test, and a locked-down container protocol test. It deliberately makes no live Anteater API calls, so it never draws on the public rate limit.
Pushing a tag that exactly matches v plus the package.json version builds six native
executables, generates checksums and provenance attestations, pushes an amd64/arm64 image
to GHCR, and publishes the GitHub Release. Stable tags update :latest; every release
updates :beta; exact :vX.Y.Z tags are immutable.
After the first image publish, set the GHCR package visibility to Public once. The
workflow uses the scoped GITHUB_TOKEN; if repository policy blocks bot-created Releases,
add a fine-grained RELEASE_PAT secret with Contents write access, matching the upstream
project's fallback.
Scope
Anteater API also serves dining halls, library traffic and study-room bookings. Those are deliberately not wrapped — this server stays focused on choosing and registering for classes.
LARC tutoring sections are in scope but effectively dead upstream: /v2/rest/larc returns
22 courses for 2024 Fall and nothing for any term since, so a tool would always answer
"none" for the term a student is actually planning.
Known limitations
These are properties of the upstream data, not bugs. The server states them rather than papering over them, because the alternative is confident wrong advice.
- WebSoc does not publish which discussion belongs to which lecture. Some courses
encode it in the section number (
Lec A→Dis A1), others number companions independently (I&C SCI 31: lectures A/B, labs 1–9).check_scheduletherefore tells you when a required component is missing entirely, and when a pairing cannot be verified — but it cannot confirm that a given lab goes with a given lecture. Confirm that on WebReg. Neither of ICSSC's own clients infers this either: AntAlmanac and PeterPortal both render sections as a flat list and leave the pairing to the student, which is good evidence the data simply is not there. - Enrollment restrictions are not evaluated against you.
search_sectionsandrecommend_coursessurface the codes and their meanings; whether you satisfy "Major only" or "Graduate only" is enforced by the registrar. - Transfer and community-college coursework is absent.
check_prerequisitesreports any completed course it does not recognise instead of silently ignoring it, but only an advisor can clear transfer credit. - No registration-window dates. The academic calendar covers instruction and finals; it does not say when your enrollment window opens. Check StudentAccess.
- Grade data lags. Recent quarters may be missing, and a recent term's grades are
often filed under
STAFF. A small sample size makes an average GPA unreliable — the tools always printnso you can judge. - Historical GPA is course-wide.
recommend_coursesranks by the average across all past instructors, which may not be whoever is teaching this term. Useget_course_gradesto check the specific instructor before deciding.
Bugs found and fixed before release
A six-dimension parallel review (logic, MCP conformance, live-API contract, security, robustness, repo readiness) produced 41 raw findings, 38 after deduplication. The ones that would actually have misled someone:
A second round, driving the server through six realistic student scenarios end to end, found 54 more — 10 of them blockers. The worst:
Also fixed: inverted check marks in NOT prerequisite subtrees, course numbers lost for
the 48 department codes containing a space, multi-byte UTF-8 corrupted across HTTP chunk
boundaries, a quadratic-backtracking regex on unvalidated input, and socAvailable
mislabelled as "enrollment opens" when it is the schedule publication date.
API quirks worth knowing
Undocumented upstream; all handled here, and listed in case they save you the debugging.
daysmust be comma-separated.Tu,Thworks,TuThis rejected. It matches at least one of the listed days, not all of them.enrollmentHistoryreturns parallel arrays (dates[],totalEnrolledHistory[],requestedHistory[], …), not scalars.-1means "not tracked".finalExam.monthis 0-indexed.- Course comments are raw HTML fragments, complete with
<p>and". startTime/endTimemean "starts at or after" and "ends at or before", not interval overlap./v2/rest/searchneeds a privileged API key. An ordinary key is refused withnot permitted to access this resource, which is a different error from thekey is requiredyou get with no key at all — worth distinguishing, since telling someone who already has a key to get a key is a dead end./v2/rest/websoc/syllabitakescourseId, notdepartment+courseNumber./v2/rest/courseMaterialsneedsdepartmentANDcourseNumbertogether. Either alone is refused, and it collapses the three summer sessions into a singleSummer.- Restriction strings contain prose.
"A and N"must be split on whitespace and have the literaland/ordiscarded, or the conjunction renders as a code. - Section status is an enum, not free text:
OPEN,Waitl,FULL,NewOnly, or empty. OnlyOPENmeans a continuing student can enrol now —NewOnlymarks seats held for incoming students.numNewOnlyReservedcounts seats inside the capacity that are reserved the same way, so the apparent opening overstates the real one.
Distribution
Published to the MCP Registry as
io.github.KKazuhaK/anteater-mcp, listing the container image only. The registry entry
describes how to run your own instance; it does not point at anyone's deployment, since a
hosted instance is gated behind its own token and its upstream quota belongs to whoever
runs it.
Each release also publishes the GHCR image and standalone binaries for six platforms.
Licence and attribution
Data from Anteater API, maintained by ICSSC Projects.
This is not an official UCI tool. Verify on WebReg or the General Catalogue before registering. Use is subject to Anteater API's attribution policy.
Licensed AGPL-3.0-or-later, matching the upstream Anteater API server so code can move freely in either direction if this is ever contributed upstream. This is an independent HTTP client and contains no upstream source code. If you modify it and run it as a network service, AGPL section 13 requires you to offer users your Corresponding Source — see NOTICE.
For academic use:
来源:README.md,提交 e48eba0
工具
0版本历史
4- v1.0.0-beta.3最新Oct 29, 2026
- v1.0.0-beta.2Oct 26, 2026
- v1.0.0-beta.1Sep 19, 2026
- v0.0.10Sep 18, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分