infinitecampus-mcp 3.2.1 → 3.2.2

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": "3.2.1"
10
+ "version": "3.2.2"
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": "3.2.1",
18
+ "version": "3.2.2",
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": "3.2.1",
4
+ "version": "3.2.2",
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
@@ -68902,7 +68902,7 @@ function resolveDownloadDir(env = process.env) {
68902
68902
  // package.json
68903
68903
  var package_default = {
68904
68904
  name: "infinitecampus-mcp",
68905
- version: "3.2.1",
68905
+ version: "3.2.2",
68906
68906
  mcpName: "io.github.chrischall/infinitecampus-mcp",
68907
68907
  description: "Infinite Campus (Campus Parent) MCP server \u2014 multi-district, read-only (plus local document download)",
68908
68908
  author: "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -70814,8 +70814,8 @@ function registerMessageTools(server, client) {
70814
70814
  return viewResponse(rawArgs.view, untrustedEnvelope({ notifications, inbox, announcements }));
70815
70815
  });
70816
70816
  server.registerTool("ic_get_message", {
70817
- description: "Fetch the HTML body of an inbox message and return it parsed into { subject, date, body, url }. Takes a `messageUrl` which is the `url` field from an item returned by ic_list_messages' inbox section (e.g. 'portal/messageView.xsl?x=messenger.MessengerEngine-getMessageRecipientView&messageID=...'). Relative and /campus/-prefixed URLs are both accepted. Note: fetching the HTML body may mark the message as read on some district configurations; probe against an empty inbox could not confirm the side effect. " + UNTRUSTED_DESCRIPTION_SUFFIX,
70818
- annotations: { readOnlyHint: true, openWorldHint: true },
70817
+ description: "Fetch the HTML body of an inbox message and return it parsed into { subject, date, body, url }. Takes a `messageUrl` which is the `url` field from an item returned by ic_list_messages' inbox section (e.g. 'portal/messageView.xsl?x=messenger.MessengerEngine-getMessageRecipientView&messageID=...'). Relative and /campus/-prefixed URLs are both accepted. Fetching the body may mark the message as read in the portal (as opening it there does), so this is not a pure read. " + UNTRUSTED_DESCRIPTION_SUFFIX,
70818
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
70819
70819
  inputSchema: external_exports.object({ ...getArgs.shape, view: viewArg() })
70820
70820
  }, async (rawArgs) => {
70821
70821
  const args = getArgs.parse(rawArgs);
@@ -71346,7 +71346,7 @@ try {
71346
71346
  }
71347
71347
  var COMMON = {
71348
71348
  name: "infinitecampus",
71349
- version: "3.2.1"
71349
+ version: "3.2.2"
71350
71350
  // x-release-please-version
71351
71351
  };
71352
71352
  var healthState = { account, source, configError, client: null };
package/dist/index.js CHANGED
@@ -56,7 +56,7 @@ catch (e) {
56
56
  // avoids — see `unconfiguredClient`.
57
57
  const COMMON = {
58
58
  name: 'infinitecampus',
59
- version: '3.2.1', // x-release-please-version
59
+ version: '3.2.2', // x-release-please-version
60
60
  };
61
61
  // Shared with the healthcheck so it can report the SAME state the tools see,
62
62
  // including on the unconfigured path where there are no tools at all.
@@ -103,9 +103,9 @@ export function registerMessageTools(server, client) {
103
103
  return viewResponse(rawArgs.view, untrustedEnvelope({ notifications, inbox, announcements }));
104
104
  });
105
105
  server.registerTool('ic_get_message', {
106
- description: "Fetch the HTML body of an inbox message and return it parsed into { subject, date, body, url }. Takes a `messageUrl` which is the `url` field from an item returned by ic_list_messages' inbox section (e.g. 'portal/messageView.xsl?x=messenger.MessengerEngine-getMessageRecipientView&messageID=...'). Relative and /campus/-prefixed URLs are both accepted. Note: fetching the HTML body may mark the message as read on some district configurations; probe against an empty inbox could not confirm the side effect. " +
106
+ description: "Fetch the HTML body of an inbox message and return it parsed into { subject, date, body, url }. Takes a `messageUrl` which is the `url` field from an item returned by ic_list_messages' inbox section (e.g. 'portal/messageView.xsl?x=messenger.MessengerEngine-getMessageRecipientView&messageID=...'). Relative and /campus/-prefixed URLs are both accepted. Fetching the body may mark the message as read in the portal (as opening it there does), so this is not a pure read. " +
107
107
  UNTRUSTED_DESCRIPTION_SUFFIX,
108
- annotations: { readOnlyHint: true, openWorldHint: true },
108
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
109
109
  inputSchema: z.object({ ...getArgs.shape, view: viewArg() }),
110
110
  }, async (rawArgs) => {
111
111
  const args = getArgs.parse(rawArgs);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinitecampus-mcp",
3
- "version": "3.2.1",
3
+ "version": "3.2.2",
4
4
  "mcpName": "io.github.chrischall/infinitecampus-mcp",
5
5
  "description": "Infinite Campus (Campus Parent) MCP server — multi-district, read-only (plus local document download)",
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": "3.2.1",
9
+ "version": "3.2.2",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "infinitecampus-mcp",
14
- "version": "3.2.1",
14
+ "version": "3.2.2",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -224,5 +224,5 @@ Two tools take no `view`, both because there is nothing to project:
224
224
  ## Caution
225
225
 
226
226
  - `ic_download_document` writes to disk at `destinationPath`, only inside the download directory, and refuses to replace an existing file unless `overwrite: true` — confirm the path with the user.
227
- - `ic_list_messages` / `ic_get_message` are nominally read-only, but on some district configurations fetching an inbox message or enumerating the list may mark entries as read. Behavior was not confirmable against an empty test inbox.
227
+ - `ic_get_message` is not annotated read-only: fetching a message's body may mark it as read in the portal, as opening it there does (not yet confirmed against a live unread message). Use it only when the user asks to open a message; summarize the inbox from `ic_list_messages`.
228
228
  - Endpoint behavior varies by district. If `ic_list_behavior`, `ic_list_food_service`, `ic_list_documents`, `ic_list_assessments`, or `ic_list_fees` returns a `FeatureDisabled` warning, that module is simply turned off for the district — it's not an error. `ic_list_fees` may also return `PartialSuccess` when only one of its two sub-endpoints works.