infinitecampus-mcp 3.1.7 → 3.1.8

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.1.7"
10
+ "version": "3.1.8"
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.1.7",
18
+ "version": "3.1.8",
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.1.7",
4
+ "version": "3.1.8",
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
@@ -25604,11 +25604,23 @@ var require_websocket = __commonJS({
25604
25604
  this._isServer = false;
25605
25605
  this._redirects = 0;
25606
25606
  if (protocols === void 0) {
25607
- protocols = [];
25607
+ if (!options || options.protocols === void 0) {
25608
+ protocols = [];
25609
+ } else if (Array.isArray(options.protocols)) {
25610
+ protocols = options.protocols;
25611
+ } else {
25612
+ protocols = [options.protocols];
25613
+ }
25608
25614
  } else if (!Array.isArray(protocols)) {
25609
25615
  if (typeof protocols === "object" && protocols !== null) {
25610
25616
  options = protocols;
25611
- protocols = [];
25617
+ if (options.protocols === void 0) {
25618
+ protocols = [];
25619
+ } else if (Array.isArray(options.protocols)) {
25620
+ protocols = options.protocols;
25621
+ } else {
25622
+ protocols = [options.protocols];
25623
+ }
25612
25624
  } else {
25613
25625
  protocols = [protocols];
25614
25626
  }
@@ -25805,7 +25817,6 @@ var require_websocket = __commonJS({
25805
25817
  }
25806
25818
  return;
25807
25819
  }
25808
- this._readyState = _WebSocket.CLOSING;
25809
25820
  this._sender.close(code, data, !this._isServer, (err) => {
25810
25821
  if (err) return;
25811
25822
  this._closeFrameSent = true;
@@ -25813,6 +25824,7 @@ var require_websocket = __commonJS({
25813
25824
  this._socket.end();
25814
25825
  }
25815
25826
  });
25827
+ this._readyState = _WebSocket.CLOSING;
25816
25828
  setCloseTimer(this);
25817
25829
  }
25818
25830
  /**
@@ -26037,6 +26049,7 @@ var require_websocket = __commonJS({
26037
26049
  socketPath: void 0,
26038
26050
  hostname: void 0,
26039
26051
  protocol: void 0,
26052
+ protocols: void 0,
26040
26053
  timeout: void 0,
26041
26054
  method: "GET",
26042
26055
  host: void 0,
@@ -62362,6 +62375,17 @@ var KNOWN_CAPABILITIES = /* @__PURE__ */ new Set([
62362
62375
  ]);
62363
62376
  var ACCOUNT_KEY_FRAME = "account-key";
62364
62377
  var ACCOUNT_ATTEST_FRAME = "account-attest";
62378
+ var BRIDGE_ROLE_FRAME = "bridge-role";
62379
+ var BRIDGE_SERVE_FRAME = "bridge-serve";
62380
+ var ROOM_PING_FRAME = "room-ping";
62381
+ var ROOM_PONG_FRAME = "room-pong";
62382
+ var BRIDGE_ROLE_LABEL_MAX = 64;
62383
+ var ROOM_FRAME_ACCEPTS = Object.freeze({
62384
+ [BRIDGE_ROLE_FRAME]: BRIDGE_ROLE_FRAME,
62385
+ [BRIDGE_SERVE_FRAME]: BRIDGE_SERVE_FRAME,
62386
+ [ROOM_PING_FRAME]: ROOM_PING_FRAME,
62387
+ [ROOM_PONG_FRAME]: ROOM_PING_FRAME
62388
+ });
62365
62389
 
62366
62390
  // node_modules/@fetchproxy/protocol/dist/mcp-id.js
62367
62391
  var ID_RE = /^([^:]+):([^:]+):([0-9a-f]{16})$/;
@@ -63027,6 +63051,12 @@ function validateFrame(raw) {
63027
63051
  return validateAccountKey(raw);
63028
63052
  if (t === ACCOUNT_ATTEST_FRAME)
63029
63053
  return validateAccountAttest(raw);
63054
+ if (t === BRIDGE_ROLE_FRAME)
63055
+ return validateBridgeRole(raw);
63056
+ if (t === BRIDGE_SERVE_FRAME || t === ROOM_PING_FRAME || t === ROOM_PONG_FRAME) {
63057
+ assertExactFields(raw, TYPE_ONLY_FIELDS, t);
63058
+ return { type: t };
63059
+ }
63030
63060
  throw new ProtocolError3(`unknown frame type: ${String(t)}`);
63031
63061
  }
63032
63062
  function validateHello(raw) {
@@ -63352,6 +63382,43 @@ function validateAccountAttest(raw) {
63352
63382
  sig: raw.sig
63353
63383
  };
63354
63384
  }
63385
+ var TYPE_ONLY_FIELDS = ["type"];
63386
+ var BRIDGE_ROLE_FIELDS = ["type", "role", "canServe", "serving"];
63387
+ var BRIDGE_ROLE_SERVING_FIELDS = ["label", "since"];
63388
+ function validateBridgeRole(raw) {
63389
+ const L = BRIDGE_ROLE_FRAME;
63390
+ const role = raw.role;
63391
+ if (role !== "serving" && role !== "standby") {
63392
+ throw new ProtocolError3(`${L}.role: must be one of serving, standby`);
63393
+ }
63394
+ const canServe = raw.canServe;
63395
+ assertBoolean(canServe, `${L}.canServe`);
63396
+ assertExactFields(raw, BRIDGE_ROLE_FIELDS, L);
63397
+ const serving = raw.serving;
63398
+ if (role === "serving") {
63399
+ if (serving !== void 0) {
63400
+ throw new ProtocolError3(`${L}.serving: must be absent when role is serving`);
63401
+ }
63402
+ return { type: BRIDGE_ROLE_FRAME, role, canServe };
63403
+ }
63404
+ if (serving === void 0) {
63405
+ throw new ProtocolError3(`${L}.serving: required when role is standby`);
63406
+ }
63407
+ assertObject(serving, `${L}.serving`);
63408
+ const label = serving.label;
63409
+ assertDisplayString(label, `${L}.serving.label`, 1, BRIDGE_ROLE_LABEL_MAX);
63410
+ const since = serving.since;
63411
+ if (typeof since !== "number" || !Number.isSafeInteger(since) || since < 0) {
63412
+ throw new ProtocolError3(`${L}.serving.since: expected non-negative safe integer (Unix ms)`);
63413
+ }
63414
+ assertExactFields(serving, BRIDGE_ROLE_SERVING_FIELDS, `${L}.serving`);
63415
+ return {
63416
+ type: BRIDGE_ROLE_FRAME,
63417
+ role,
63418
+ canServe,
63419
+ serving: { label, since }
63420
+ };
63421
+ }
63355
63422
  function validateInnerFrame(raw) {
63356
63423
  assertObject(raw, "inner");
63357
63424
  const t = raw.type;
@@ -68555,7 +68622,7 @@ function resolveDownloadDir(env = process.env) {
68555
68622
  // package.json
68556
68623
  var package_default = {
68557
68624
  name: "infinitecampus-mcp",
68558
- version: "3.1.7",
68625
+ version: "3.1.8",
68559
68626
  mcpName: "io.github.chrischall/infinitecampus-mcp",
68560
68627
  description: "Infinite Campus (Campus Parent) MCP server \u2014 multi-district read + message/document write",
68561
68628
  author: "Claude Code (AI) <https://www.anthropic.com/claude>",
@@ -68600,9 +68667,9 @@ var package_default = {
68600
68667
  typecheck: "tsc -p tsconfig.json --noEmit"
68601
68668
  },
68602
68669
  dependencies: {
68603
- "@chrischall/mcp-utils": "^2.14.0",
68604
- "@fetchproxy/bootstrap": "^3.4.1",
68605
- "@fetchproxy/server": "^3.4.1",
68670
+ "@chrischall/mcp-utils": "^2.15.0",
68671
+ "@fetchproxy/bootstrap": "^3.6.0",
68672
+ "@fetchproxy/server": "^3.6.0",
68606
68673
  "@modelcontextprotocol/server": "^2.3.0",
68607
68674
  dotenv: "^18.0.2",
68608
68675
  "node-html-parser": "^9.0.0",
@@ -70841,7 +70908,7 @@ try {
70841
70908
  }
70842
70909
  var COMMON = {
70843
70910
  name: "infinitecampus",
70844
- version: "3.1.7"
70911
+ version: "3.1.8"
70845
70912
  // x-release-please-version
70846
70913
  };
70847
70914
  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.1.7', // x-release-please-version
59
+ version: '3.1.8', // 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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinitecampus-mcp",
3
- "version": "3.1.7",
3
+ "version": "3.1.8",
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>",
@@ -45,9 +45,9 @@
45
45
  "typecheck": "tsc -p tsconfig.json --noEmit"
46
46
  },
47
47
  "dependencies": {
48
- "@chrischall/mcp-utils": "^2.14.0",
49
- "@fetchproxy/bootstrap": "^3.4.1",
50
- "@fetchproxy/server": "^3.4.1",
48
+ "@chrischall/mcp-utils": "^2.15.0",
49
+ "@fetchproxy/bootstrap": "^3.6.0",
50
+ "@fetchproxy/server": "^3.6.0",
51
51
  "@modelcontextprotocol/server": "^2.3.0",
52
52
  "dotenv": "^18.0.2",
53
53
  "node-html-parser": "^9.0.0",
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.1.7",
9
+ "version": "3.1.8",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "infinitecampus-mcp",
14
- "version": "3.1.7",
14
+ "version": "3.1.8",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },