infinitecampus-mcp 2.8.0 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "MCP server for Infinite Campus (Campus Parent) — grades, attendance, assignments, messages, documents",
10
- "version": "2.8.0"
10
+ "version": "2.8.1"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "Infinite Campus",
16
16
  "source": "./",
17
17
  "description": "Infinite Campus (Campus Parent) MCP server for Claude — grades, attendance, assignments, messages, and documents via natural language",
18
- "version": "2.8.0",
18
+ "version": "2.8.1",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "infinitecampus-mcp",
3
3
  "displayName": "Infinite Campus",
4
- "version": "2.8.0",
4
+ "version": "2.8.1",
5
5
  "description": "Infinite Campus (Campus Parent) MCP server for Claude — grades, attendance, assignments, messages, and documents",
6
6
  "author": {
7
7
  "name": "Chris Hall",
package/dist/bundle.js CHANGED
@@ -39560,7 +39560,7 @@ function loadAccount(env = process.env) {
39560
39560
  // package.json
39561
39561
  var package_default = {
39562
39562
  name: "infinitecampus-mcp",
39563
- version: "2.8.0",
39563
+ version: "2.8.1",
39564
39564
  mcpName: "io.github.chrischall/infinitecampus-mcp",
39565
39565
  description: "Infinite Campus (Campus Parent) MCP server \u2014 multi-district read + message/document write",
39566
39566
  author: "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -41578,7 +41578,7 @@ try {
41578
41578
  }
41579
41579
  var COMMON = {
41580
41580
  name: "infinitecampus",
41581
- version: "2.8.0"
41581
+ version: "2.8.1"
41582
41582
  // x-release-please-version
41583
41583
  };
41584
41584
  var healthState = { account, source, configError, client: null };
package/dist/index.js CHANGED
@@ -58,7 +58,7 @@ catch (e) {
58
58
  // actionable stderr message (banner) instead of a crash loop.
59
59
  const COMMON = {
60
60
  name: 'infinitecampus',
61
- version: '2.8.0', // x-release-please-version
61
+ version: '2.8.1', // x-release-please-version
62
62
  };
63
63
  // Shared with the healthcheck so it can report the SAME state the tools see,
64
64
  // including on the unconfigured path where there are no tools at all.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinitecampus-mcp",
3
- "version": "2.8.0",
3
+ "version": "2.8.1",
4
4
  "mcpName": "io.github.chrischall/infinitecampus-mcp",
5
5
  "description": "Infinite Campus (Campus Parent) MCP server — multi-district read + message/document write",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/chrischall/infinitecampus-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "2.8.0",
9
+ "version": "2.8.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "infinitecampus-mcp",
14
- "version": "2.8.0",
14
+ "version": "2.8.1",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -103,45 +103,88 @@ inexplicably. Most student-scoped tools also take `studentId` (the personID from
103
103
  ### Districts & Students
104
104
  | Tool | Notes |
105
105
  |------|-------|
106
- | `ic_list_districts` | Lists configured districts (primary + any CUPS-linked). Call this first — other tools need the `district` name. |
107
- | `ic_list_students(district)` | Lists students (kids) attached to the portal account for a district. Use the `personID` for `studentId` on other tools. |
106
+ | `ic_list_districts(view?)` | Lists configured districts (primary + any CUPS-linked). Call this first — other tools need the `district` name. |
107
+ | `ic_list_students(district, view?)` | Lists students (kids) attached to the portal account for a district. Use the `personID` for `studentId` on other tools. |
108
108
 
109
109
  ### Academics
110
110
  | Tool | Notes |
111
111
  |------|-------|
112
- | `ic_get_schedule(district, studentId)` | Today's class schedule by default, with section placements. |
113
- | `ic_list_assignments(district, studentId, courseId?, since?, until?, missingOnly?)` | `sectionID` is the only server-side filter; `since`/`until`/`missingOnly` are applied client-side. Pass `missingOnly=true` to see only missing/late work across all courses. |
114
- | `ic_list_grades(district, studentId, termId?)` | Term + in-progress grade summary. Omit `termId` for all terms. |
115
- | `ic_list_recent_grades(district, studentId, since?)` | Recently-scored assignments. Defaults to a 14-day window; pass `since` (YYYY-MM-DD) to widen. |
116
- | `ic_list_assessments(district, studentId)` | Standardized test scores (state/national/district tests). FeatureDisabled-aware. |
117
- | `ic_list_teachers(district, studentId)` | Teachers per enrolled section + assigned counselor(s). |
112
+ | `ic_get_schedule(district, studentId, view?)` | Today's class schedule by default, with section placements. |
113
+ | `ic_list_assignments(district, studentId, courseId?, since?, until?, missingOnly?, view?)` | `sectionID` is the only server-side filter; `since`/`until`/`missingOnly` are applied client-side. Pass `missingOnly=true` to see only missing/late work across all courses. |
114
+ | `ic_list_grades(district, studentId, termId?, view?)` | Term + in-progress grade summary. Omit `termId` for all terms. |
115
+ | `ic_list_recent_grades(district, studentId, since?, view?)` | Recently-scored assignments. Defaults to a 14-day window; pass `since` (YYYY-MM-DD) to widen. |
116
+ | `ic_list_assessments(district, studentId, view?)` | Standardized test scores (state/national/district tests). FeatureDisabled-aware. |
117
+ | `ic_list_teachers(district, studentId, view?)` | Teachers per enrolled section + assigned counselor(s). |
118
118
 
119
119
  ### Daily life
120
120
  | Tool | Notes |
121
121
  |------|-------|
122
- | `ic_list_school_days(district, studentId)` | Instructional calendar with term boundaries. |
123
- | `ic_list_attendance(district, studentId, since?, until?)` | Per-course attendance summary grouped by term. |
124
- | `ic_list_attendance_events(district, studentId, since?, until?, excusedOnly?)` | Individual absence/tardy events with codes and human comments. |
125
- | `ic_list_behavior(district, studentId, since?, until?)` | Returns a `FeatureDisabled` warning if the district has no behavior module enabled — this is not an error. |
126
- | `ic_list_food_service(district, studentId, since?, until?)` | Lunch balance and transactions. Same `FeatureDisabled` fallback as behavior. |
127
- | `ic_list_fees(district, studentId)` | Fee assignments + surplus/balance. Returns `PartialSuccess` if only one endpoint works, `FeatureDisabled` if both 404. |
122
+ | `ic_list_school_days(district, studentId, view?)` | Instructional calendar with term boundaries. |
123
+ | `ic_list_attendance(district, studentId, since?, until?, view?)` | Per-course attendance summary grouped by term. |
124
+ | `ic_list_attendance_events(district, studentId, since?, until?, excusedOnly?, view?)` | Individual absence/tardy events with codes and human comments. |
125
+ | `ic_list_behavior(district, studentId, since?, until?, view?)` | Returns a `FeatureDisabled` warning if the district has no behavior module enabled — this is not an error. |
126
+ | `ic_list_food_service(district, studentId, since?, until?, view?)` | Lunch balance and transactions. Same `FeatureDisabled` fallback as behavior. |
127
+ | `ic_list_fees(district, studentId, view?)` | Fee assignments + surplus/balance. Returns `PartialSuccess` if only one endpoint works, `FeatureDisabled` if both 404. |
128
128
 
129
129
  ### Documents
130
130
  | Tool | Notes |
131
131
  |------|-------|
132
- | `ic_list_documents(district, studentId)` | Metadata only (report cards, schedules, transcripts). Each item has a `url` to pass to `ic_download_document`. Returns `FeatureDisabled` if the documents module is off. |
132
+ | `ic_list_documents(district, studentId, view?)` | Metadata only (report cards, schedules, transcripts). Each item has a `url` to pass to `ic_download_document`. Returns `FeatureDisabled` if the documents module is off. |
133
133
  | `ic_download_document(district, url, destinationPath)` | Writes the document to `destinationPath` on disk. **`destinationPath` is required** — confirm the path with the user before calling. |
134
134
 
135
135
  ### Messaging
136
136
  | Tool | Notes |
137
137
  |------|-------|
138
- | `ic_list_messages(district, limit?)` | Combines three sources: **prism notifications** (grade/attendance/assignment alerts), **Messenger 2.0 inbox** (teacher messages, priority announcements like closures), and **portal userNotice** (district banners). `limit` caps prism only. Per-source `error` field if one fails. |
139
- | `ic_get_message(district, url)` | Fetches and parses the HTML body of an inbox message. Returns `{ subject, date, body, url }`. |
138
+ | `ic_list_messages(district, limit?, view?)` | Combines three sources: **prism notifications** (grade/attendance/assignment alerts), **Messenger 2.0 inbox** (teacher messages, priority announcements like closures), and **portal userNotice** (district banners). `limit` caps prism only. Per-source `error` field if one fails. |
139
+ | `ic_get_message(district, url, view?)` | Fetches and parses the HTML body of an inbox message. Returns `{ subject, date, body, url }`. |
140
140
 
141
141
  ### Features
142
142
  | Tool | Notes |
143
143
  |------|-------|
144
- | `ic_get_features(district, studentId)` | Raw per-enrollment `displayOptions` flags (attendance/behavior/assessment/documents/…). Useful for diagnosing why another tool returned `FeatureDisabled`. |
144
+ | `ic_get_features(district, studentId, view?)` | Raw per-enrollment `displayOptions` flags (attendance/behavior/assessment/documents/…). Useful for diagnosing why another tool returned `FeatureDisabled`. |
145
+
146
+ ## Response shape (`view`)
147
+
148
+ Every read tool here — 18 of the server's 20 — takes `view: "compact" | "full"`,
149
+ and **`compact` is the default**. You get the slim shape without asking for it;
150
+ the efficiency is not something a caller has to know to request.
151
+
152
+ **What compact does here is remove pictures, and nothing else.** It drops keys
153
+ named for an image — a student's `photo` and `thumbnailUrl`, a counselor's
154
+ `avatar` — and any string whose value is a bare image URL even under a key the
155
+ pattern has never heard of — a student record's `schoolLogo: ".../assets/logo.png"` goes for
156
+ that second reason. Everything else comes back verbatim, fields nobody
157
+ anticipated included.
158
+
159
+ **It is deliberately NOT a field projection, and that is the thing to know
160
+ before you reach for `full`.** In sibling servers compact means "the fields a
161
+ caller acts on", so `full` buys back real content. Here it does not. This server
162
+ hands Infinite Campus's payloads back close to verbatim and holds no verified
163
+ record of what those payloads contain — no captured fixture, no documented field
164
+ list — so nothing could honestly say which IC fields matter and which are noise.
165
+ Stripping media needs no such knowledge and is purely subtractive, so it cannot
166
+ punch a hole in a record by failing to know about a field. The consequence for
167
+ you: `view: "full"` returns the same record with the image URLs put back, and
168
+ nothing else. **If a field is missing from a compact response, `full` will not
169
+ produce it** — that field was not in what Infinite Campus sent.
170
+
171
+ One trim is the TOOL's, not the rung's: `ic_list_documents` reduces each
172
+ document to `name`, `type`, `url`, `moduleLabel` and `endYear` in its handler,
173
+ before any view is applied. `full` does not restore the rest of IC's document
174
+ record.
175
+
176
+ There is deliberately **no `raw` rung**. `full` already IS Infinite Campus's
177
+ payload untouched, so a third value could only silently alias it. `view: "raw"`
178
+ is rejected by the schema with an error rather than quietly answered in some
179
+ other shape.
180
+
181
+ Two tools take no `view`, both because there is nothing to project:
182
+
183
+ - **`ic_download_document`** writes a PDF to disk and returns a receipt. Its
184
+ product IS the document — media-stripping a tool that exists to hand you a
185
+ file would not shrink the answer, it would empty it.
186
+ - **`ic_healthcheck`** takes no arguments at all. Its answer is a fixed
187
+ credential-and-district verdict, already narrower than any projection.
145
188
 
146
189
  ## Workflows
147
190