Skip to content

infinitecampus mcp changelog

io.github.chrischall/infinitecampus-mcp

12 changes recorded. MCP Harbor re-reads this listing from the official registry every six hours and asks the live server what it exposes, and keeps what changed between one look and the next.

  • server.json 1 field changed
    version
    3.3.1 3.3.2

  • server.json 1 field changed
    version
    3.3.0 3.3.1

  • server.json 1 field changed
    version
    3.2.2 3.3.0

  • server.json 1 field changed
    version
    3.2.1 3.2.2

  • AGENTS.md +1 −153

    https://raw.githubusercontent.com/chrischall/infinitecampus-mcp/HEAD/AGENTS.md

    − # infinitecampus-mcp− MCP server for Infinite Campus (Campus Parent portal). Single-account config; linked districts are auto-discovered via CUPS SSO after primary login. Stdio transport, 20 tools across academics, daily life, documents, messaging, and a credential/district healthcheck.− ## Commands− ```bash− npm run build        # tsc → dist/ + esbuild bundle → dist/bundle.js− npm run bundle       # esbuild only (skip tsc)− npm run dev          # node --env-file=.env dist/index.js (requires built dist/)− npm test             # tsc typecheck + vitest run (all tests)− npm run test:watch   # vitest in watch mode− ```− `dist/` is gitignored; CI rebuilds it and npm publish ships it via the `files` array in `package.json`. Rebuild locally before publishing or verifying end-to-end.− ## Tool naming− All tools are prefixed `ic_` (e.g. `ic_list_grades`, `ic_get_schedule`). Every per-student tool takes `district` as its first arg; use `ic_list_districts` to get valid names.− ## Response shape (`view`)− `src/view.ts` holds this server's rung vocabulary (`compact` | `full`, defaulting− to **compact**) over `viewParam`/`resolveView`/`stripMediaUrls`/`minifiedResult`− from `@chrischall/mcp-utils`. **All 18 read tools** (`readOnlyHint: true`) take− `view` and answer through `viewResponse`; `ic_download_document` does not — it is− a write (`destructiveHint`) whose response is a receipt with nothing to strip.− **Compact here strips media URLs and does nothing else.** That is the whole− projection, and the restraint is the point: this repo holds no captured Infinite− Campus payload and no documented field list, so nothing here can honestly say− which of IC's fields matter. A media strip is SUBTRACTIVE, so it cannot punch a− hole in a record by failing to know about a field — the failure an invented− field list would risk, where a half-filled record reads as a verified answer.− When a real payload can be captured, a field projection belongs beside it.− **There is no `raw` rung.** It is in the fleet vocabulary but not in `IC_VIEWS`,− so the *schema* rejects `view: "raw"` rather than the handler silently aliasing− it to something else. A tool must never advertise a rung it does not honour.− `view` is read off `rawArgs`, never off the parsed args, and never reaches− Infinite Campus: each handler still does `argsSchema.parse(rawArgs)` (zod strips− unknown keys) and builds its URL from named fields. Nothing in `src/` spreads− raw args into a request — `tests/view.test.ts` asserts it on the recorded− `ICClient.request` calls, which is how two sibling repos leaked it.− ## Architecture− ```− src/−   index.ts             # MCP server entry — loadDotenvSafely + runMcp (both from−                        #   @chrischall/mcp-utils): registers all tools, stdio transport, graceful shutdown−   auth.ts              # resolveAuth(): two-path priority (env vars → fetchproxy fallback). Pattern A template+ CLAUDE.md

    Showing the first 40 of each.

  • server.json 1 field changed
    version
    3.2.0 3.2.1

  • server.json 1 field changed
    version
    3.1.9 3.2.0

  • server.json 2 fields changed
    env_vars
    IC_BASE_URL, IC_DISTRICT, IC_USERNAME, IC_PASSWORD, IC_NAME, IC_DISABLE_FETCHPROXY, IC_SESSION_CACHE, IC_SESSION_FILE, IC_DOWNLOAD_DIR IC_BASE_URL, IC_DISTRICT, IC_USERNAME, IC_PASSWORD, IC_NAME, IC_DISABLE_FETCHPROXY, IC_SESSION_CACHE, IC_SESSION_FILE, IC_DOWNLOAD_DIR, FETCHPROXY_WS_PORT, FETCHPROXY_WS_HOST, FETCHPROXY_IDENTITY_DIR
    version
    3.1.8 3.1.9

  • AGENTS.md +2 −2

    https://raw.githubusercontent.com/chrischall/infinitecampus-mcp/HEAD/AGENTS.md

    − Commits land on `main` via PR. release-please (`.github/workflows/release-please.yml`) opens or updates a `chore(main): release X.Y.Z` PR whenever Conventional-Commit messages (`feat:`, `fix:`, etc.) accumulate. Merging the release PR (arm `ready-to-merge`) creates the tag and a GitHub Release; the `publish` job then packs `.mcpb` + `.skill`, publishes to npm with provenance, and pushes to the MCP Registry.− - **`ic_download_document`** is the only write/IO tool (writes to disk). Writes are confined to `IC_DOWNLOAD_DIR` (default `~/Downloads`; relative `destinationPath`s resolve against it): the parent is realpath'd and must sit inside it, a symlinked destination is refused even with `overwrite`, and the write uses flag `wx` unless `overwrite: true` (fleet-audit#145). It also pre-flights directory destinations, a missing parent dir and existing files — all before any request. Supports absolute URLs + Commits land on `main` via PR. release-please (`.github/workflows/release-please.yml`) opens or updates a `chore(main): release X.Y.Z` PR whenever Conventional-Commit messages (`feat:`, `fix:`, etc.) accumulate. Merging the release PR creates the tag and a GitHub Release; the `publish` job then packs `.mcpb` + `.skill`, publishes to npm with provenance, and pushes to the MCP Registry.+ - **`ic_download_document`** is the only write/IO tool (writes to disk). Writes are confined to `IC_DOWNLOAD_DIR` (default `~/Downloads`; relative `destinationPath`s resolve against it): the parent is realpath'd and must sit inside it, a symlinked destination is refused even with `overwrite` — re-enforced at open time with `O_NOFOLLOW`, since a link can be planted while the document is fetched — and the write uses `O_EXCL` unless `overwrite: true` (fleet-audit#145, #212). Containment is mcp-util

  • server.json 1 field changed
    version
    3.1.7 3.1.8

  • server.json 1 field changed
    version
    3.1.6 3.1.7

  • server.json 1 field changed
    version
    3.1.5 3.1.6