canvas-lms-mcp 2.5.0 → 2.5.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.
- package/README.md +22 -1
- package/dist/auth/oauth/config.d.ts +0 -2
- package/dist/auth/oauth/config.d.ts.map +1 -1
- package/dist/canvas/index.cjs +3 -3
- package/dist/canvas/index.js +2 -2
- package/dist/{chunk-LGKRFDO5.cjs → chunk-27FJDG3Y.cjs} +5 -5
- package/dist/{chunk-LGKRFDO5.cjs.map → chunk-27FJDG3Y.cjs.map} +1 -1
- package/dist/{chunk-SIEP7DD3.js → chunk-2EY3U7IR.js} +2 -2
- package/dist/{chunk-SBND74S5.js → chunk-66TL3XQU.js} +2 -2
- package/dist/{chunk-SBND74S5.js.map → chunk-66TL3XQU.js.map} +1 -1
- package/dist/{chunk-UPPKHSKZ.cjs → chunk-DG22XTGE.cjs} +7 -7
- package/dist/{chunk-UPPKHSKZ.cjs.map → chunk-DG22XTGE.cjs.map} +1 -1
- package/dist/{chunk-57FVMCK2.cjs → chunk-IQU4YMPO.cjs} +335 -335
- package/dist/{chunk-57FVMCK2.cjs.map → chunk-IQU4YMPO.cjs.map} +1 -1
- package/dist/{chunk-VMVKS3DW.js → chunk-OIIPWPVG.js} +1 -51
- package/dist/chunk-OIIPWPVG.js.map +1 -0
- package/dist/{chunk-EYLQ2ORN.js → chunk-QBDIQW5O.js} +3 -3
- package/dist/{chunk-P5SCK76M.cjs → chunk-TM4JMH3A.cjs} +2 -52
- package/dist/chunk-TM4JMH3A.cjs.map +1 -0
- package/dist/{chunk-6HWWSXBU.js → chunk-U2FEEK3Y.js} +2 -2
- package/dist/{chunk-ZKG3VDNN.cjs → chunk-ZOOMOVE5.cjs} +2 -2
- package/dist/{chunk-ZKG3VDNN.cjs.map → chunk-ZOOMOVE5.cjs.map} +1 -1
- package/dist/cli.cjs +3 -3
- package/dist/cli.js +2 -2
- package/dist/doctor.cjs +9 -9
- package/dist/doctor.js +1 -1
- package/dist/http.cjs +96 -60
- package/dist/http.cjs.map +1 -1
- package/dist/http.js +52 -16
- package/dist/http.js.map +1 -1
- package/dist/init.cjs +3 -3
- package/dist/init.js +1 -1
- package/dist/server.cjs +4 -4
- package/dist/server.js +3 -3
- package/dist/stdio.cjs +7 -7
- package/dist/stdio.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-P5SCK76M.cjs.map +0 -1
- package/dist/chunk-VMVKS3DW.js.map +0 -1
- /package/dist/{chunk-SIEP7DD3.js.map → chunk-2EY3U7IR.js.map} +0 -0
- /package/dist/{chunk-EYLQ2ORN.js.map → chunk-QBDIQW5O.js.map} +0 -0
- /package/dist/{chunk-6HWWSXBU.js.map → chunk-U2FEEK3Y.js.map} +0 -0
package/README.md
CHANGED
|
@@ -345,6 +345,27 @@ const courses = await canvas.courses.list()
|
|
|
345
345
|
| `CANVAS_PSEUDONYM_AUDIT_LOG` | No | Path to an append-only file that mirrors `resolve_pseudonym` audit lines (stderr is always written) |
|
|
346
346
|
| `CANVAS_PROVENANCE_FENCING` | No | **On by default.** Set to exactly `false` to disable [provenance fencing](#provenance-fencing-untrusted-canvas-content) |
|
|
347
347
|
| `CANVAS_DESTRUCTIVE_TOOLS` | No | `allow` (default) or `block`. Set to exactly `block` to unregister the ten irreversible delete tools (see [Destructive tool policy](#destructive-tool-policy)) |
|
|
348
|
+
| `CANVAS_STRING_IDS` | No | **Off by default.** Set to exactly `true` to request Canvas identifiers as JSON strings instead of numbers (see [64-bit Canvas identifiers](#64-bit-canvas-identifiers-opt-in-string-ids)) |
|
|
349
|
+
|
|
350
|
+
## 64-bit Canvas identifiers (opt-in string IDs)
|
|
351
|
+
|
|
352
|
+
Canvas IDs are 64-bit integers, but a sharded, multi-tenant hosted Canvas assigns global IDs well above `Number.MAX_SAFE_INTEGER` (`9007199254740991`) once an account lives on shard 901 or higher. `JSON.parse` silently rounds such a value — `9010000000000001` arrives as `9010000000000000` — before any code in this server, or in the client reading its response, ever sees it.
|
|
353
|
+
|
|
354
|
+
**Off by default, opt-in, byte-exact to enable:**
|
|
355
|
+
|
|
356
|
+
```bash
|
|
357
|
+
CANVAS_STRING_IDS=true canvas-lms-mcp --base-url https://school.instructure.com
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
The comparison is `=== "true"` and nothing else — no trimming, no case-folding, no truthy coercion. `True`, `TRUE`, `1`, `yes`, a trailing space, or an unset variable all leave the flag **off**. This is deliberate: every normalization step on a flag value widens the set of strings that can enable it by accident, and a precision feature that silently stays off is safer than one that silently turns on.
|
|
361
|
+
|
|
362
|
+
With the flag on, this server asks Canvas to render every identifier as a JSON **string** rather than a number, on every `/api/v1` request it issues — including list endpoints and every page a response's pagination `Link` leads to — so the string form follows the data through to the end of a paginated fetch, not just the first page.
|
|
363
|
+
|
|
364
|
+
**Not sent to New Quizzes.** `/api/quiz/v1` is served by a separate service that does not implement this negotiation, so the header is deliberately not sent on those 11 request call sites; a New Quizzes response's identifiers are unaffected by this flag either way.
|
|
365
|
+
|
|
366
|
+
**What a caller observes:** every identifier in a tool's response — the MCP structured-content surface, the text surface, and the typed `CanvasClient` returned by [library import](docs/integration-guide.md#pattern-3-library-import-embedded-server) — becomes a canonical decimal string instead of a `number`, independent of this flag. Response identifiers are normalized to strings unconditionally so a client never has to special-case "did the flag catch this field"; the flag controls only whether Canvas itself renders large IDs precisely before that normalization runs, which is what actually prevents the precision loss for IDs above the safe-integer range.
|
|
367
|
+
|
|
368
|
+
**Recommended for any hosted, multi-shard Canvas instance** — i.e., most institutional (non-self-hosted) deployments — where object IDs on shard 901+ are reachable in principle. A single-shard, self-hosted Canvas has no exposure and can leave this off.
|
|
348
369
|
|
|
349
370
|
## Destructive tool policy
|
|
350
371
|
|
|
@@ -611,7 +632,7 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) for the full contribution and validatio
|
|
|
611
632
|
Thanks to our community contributors for improving canvas-lms-mcp:
|
|
612
633
|
|
|
613
634
|
- [@roowus](https://github.com/roowus): tuple-style JSON Schema fix for OpenAI-compatible clients ([#308](https://github.com/bruchris/canvas-lms-mcp/pull/308))
|
|
614
|
-
- [@algorithm0r](https://github.com/algorithm0r): New Quizzes payload fix ([#367](https://github.com/bruchris/canvas-lms-mcp/pull/367)), module item update/delete ([#368](https://github.com/bruchris/canvas-lms-mcp/pull/368)), Classic Quiz deletes ([#369](https://github.com/bruchris/canvas-lms-mcp/pull/369)), rubric attach/delete ([#370](https://github.com/bruchris/canvas-lms-mcp/pull/370)), assignment grading fields ([#371](https://github.com/bruchris/canvas-lms-mcp/pull/371))
|
|
635
|
+
- [@algorithm0r](https://github.com/algorithm0r): New Quizzes payload fix ([#367](https://github.com/bruchris/canvas-lms-mcp/pull/367)), module item update/delete ([#368](https://github.com/bruchris/canvas-lms-mcp/pull/368)), Classic Quiz deletes ([#369](https://github.com/bruchris/canvas-lms-mcp/pull/369)), rubric attach/delete ([#370](https://github.com/bruchris/canvas-lms-mcp/pull/370)), assignment grading fields ([#371](https://github.com/bruchris/canvas-lms-mcp/pull/371)), assignment lock and unlock dates ([#424](https://github.com/bruchris/canvas-lms-mcp/pull/424)), course grade weighting and display settings ([#425](https://github.com/bruchris/canvas-lms-mcp/pull/425))
|
|
615
636
|
- [@chiptoe-svg](https://github.com/chiptoe-svg): rubric association lookup on get_rubric ([#327](https://github.com/bruchris/canvas-lms-mcp/pull/327))
|
|
616
637
|
|
|
617
638
|
See [all contributors](https://github.com/bruchris/canvas-lms-mcp/graphs/contributors).
|
|
@@ -87,6 +87,4 @@ export declare function loadOAuthProfileConfig(env: OAuthEnv, overrides?: OAuthC
|
|
|
87
87
|
* network. Returns the host to bind, or throws.
|
|
88
88
|
*/
|
|
89
89
|
export declare function resolveBindHost(config: OAuthProfileConfig, requestedHost: string | undefined): string;
|
|
90
|
-
/** Hash a pre-registered client secret for storage; exported for the client store. */
|
|
91
|
-
export declare function hashClientSecret(secret: string): string;
|
|
92
90
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/config.ts"],"names":[],"mappings":"AAOA,uEAAuE;AACvE,eAAO,MAAM,UAAU,0CAA2C,CAAA;AAClE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAElD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAED,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B,UAAkB,CAAA;AAEzD,2BAA2B;AAC3B,eAAO,MAAM,wBAAwB,QAAU,CAAA;AAC/C,eAAO,MAAM,yBAAyB,QAAoB,CAAA;AAC1D,eAAO,MAAM,8BAA8B,QAAS,CAAA;AACpD,eAAO,MAAM,iCAAiC,QAAU,CAAA;AAExD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAA;IACd,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,YAAY,EAAE,MAAM,CAAA;QACpB,qEAAqE;QACrE,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC9B,mBAAmB,EAAE,OAAO,CAAA;IAC5B,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,6SAYjB,CAAA;AAEV,MAAM,WAAW,QAAQ;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,mCAAmC,CAAC,EAAE,MAAM,CAAA;IAC5C,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,0BAA0B,CAAC,EAAE,MAAM,CAAA;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,CA4BzF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAExD;AAyED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,QAAQ,EACb,SAAS,GAAE,oBAAyB,GACnC,kBAAkB,CA0EpB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,kBAAkB,EAC1B,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,CAaR"}
|
package/dist/canvas/index.cjs
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunk27FJDG3Ycjs = require('../chunk-27FJDG3Y.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
var
|
|
15
|
+
var _chunkZOOMOVE5cjs = require('../chunk-ZOOMOVE5.cjs');
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
|
|
@@ -25,5 +25,5 @@ var _chunkZKG3VDNNcjs = require('../chunk-ZKG3VDNN.cjs');
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
exports.CANVAS_MAX_ID =
|
|
28
|
+
exports.CANVAS_MAX_ID = _chunk27FJDG3Ycjs.CANVAS_MAX_ID; exports.CanvasApiError = _chunkZOOMOVE5cjs.CanvasApiError; exports.CanvasClient = _chunk27FJDG3Ycjs.CanvasClient; exports.CanvasHttpClient = _chunkZOOMOVE5cjs.CanvasHttpClient; exports.MAX_SAFE_CANVAS_NUMBER_ID = _chunk27FJDG3Ycjs.MAX_SAFE_CANVAS_NUMBER_ID; exports.appendCanvasQuery = _chunkZOOMOVE5cjs.appendCanvasQuery; exports.canvasIdInput = _chunk27FJDG3Ycjs.canvasIdInput; exports.canvasIdList = _chunk27FJDG3Ycjs.canvasIdList; exports.compareCanvasIds = _chunk27FJDG3Ycjs.compareCanvasIds; exports.normalizeCanvasIdInput = _chunk27FJDG3Ycjs.normalizeCanvasIdInput; exports.toCanvasQuery = _chunkZOOMOVE5cjs.toCanvasQuery;
|
|
29
29
|
//# sourceMappingURL=index.cjs.map
|
package/dist/canvas/index.js
CHANGED
|
@@ -6,13 +6,13 @@ import {
|
|
|
6
6
|
canvasIdList,
|
|
7
7
|
compareCanvasIds,
|
|
8
8
|
normalizeCanvasIdInput
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-2EY3U7IR.js";
|
|
10
10
|
import {
|
|
11
11
|
CanvasApiError,
|
|
12
12
|
CanvasHttpClient,
|
|
13
13
|
appendCanvasQuery,
|
|
14
14
|
toCanvasQuery
|
|
15
|
-
} from "../chunk-
|
|
15
|
+
} from "../chunk-66TL3XQU.js";
|
|
16
16
|
export {
|
|
17
17
|
CANVAS_MAX_ID,
|
|
18
18
|
CanvasApiError,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkZOOMOVE5cjs = require('./chunk-ZOOMOVE5.cjs');
|
|
5
5
|
|
|
6
6
|
// src/canvas/courses.ts
|
|
7
7
|
var DEFAULT_LIST_INCLUDE = ["term"];
|
|
@@ -283,7 +283,7 @@ var RubricsModule = class {
|
|
|
283
283
|
headers: { "Content-Type": "application/x-www-form-urlencoded" }
|
|
284
284
|
});
|
|
285
285
|
if (result.error === true) {
|
|
286
|
-
throw new (0,
|
|
286
|
+
throw new (0, _chunkZOOMOVE5cjs.CanvasApiError)(
|
|
287
287
|
_optionalChain([result, 'access', _2 => _2.messages, 'optionalAccess', _3 => _3.join, 'call', _4 => _4("; ")]) || "Canvas rejected the rubric",
|
|
288
288
|
422,
|
|
289
289
|
endpoint
|
|
@@ -1512,7 +1512,7 @@ var NewQuizzesModule = class {
|
|
|
1512
1512
|
`/api/quiz/v1/courses/${courseId}/accommodations/${userId}`
|
|
1513
1513
|
);
|
|
1514
1514
|
} catch (err) {
|
|
1515
|
-
if (err instanceof
|
|
1515
|
+
if (err instanceof _chunkZOOMOVE5cjs.CanvasApiError && err.status === 404) return null;
|
|
1516
1516
|
throw err;
|
|
1517
1517
|
}
|
|
1518
1518
|
}
|
|
@@ -2011,7 +2011,7 @@ var CanvasClient = class {
|
|
|
2011
2011
|
|
|
2012
2012
|
|
|
2013
2013
|
constructor(config) {
|
|
2014
|
-
this.client = new (0,
|
|
2014
|
+
this.client = new (0, _chunkZOOMOVE5cjs.CanvasHttpClient)(config);
|
|
2015
2015
|
this.courses = new CoursesModule(this.client);
|
|
2016
2016
|
this.assignments = new AssignmentsModule(this.client);
|
|
2017
2017
|
this.submissions = new SubmissionsModule(this.client);
|
|
@@ -2060,4 +2060,4 @@ var CanvasClient = class {
|
|
|
2060
2060
|
|
|
2061
2061
|
|
|
2062
2062
|
exports.mapWithConcurrency = mapWithConcurrency; exports.SEARCH_CONTENT_TYPES = SEARCH_CONTENT_TYPES; exports.OUTCOME_CONTEXT_TYPES = OUTCOME_CONTEXT_TYPES; exports.OUTCOME_DETAIL_LEVELS = OUTCOME_DETAIL_LEVELS; exports.OUTCOME_ROLLUP_AGGREGATE_STATS = OUTCOME_ROLLUP_AGGREGATE_STATS; exports.OUTCOME_ROLLUP_SORT_BY = OUTCOME_ROLLUP_SORT_BY; exports.OUTCOME_SORT_ORDER = OUTCOME_SORT_ORDER; exports.OUTCOME_EXCLUDE_OPTIONS = OUTCOME_EXCLUDE_OPTIONS; exports.CANVAS_MAX_ID = CANVAS_MAX_ID; exports.MAX_SAFE_CANVAS_NUMBER_ID = MAX_SAFE_CANVAS_NUMBER_ID; exports.canvasIdInput = canvasIdInput; exports.canvasIdList = canvasIdList; exports.compareCanvasIds = compareCanvasIds; exports.normalizeCanvasIdInput = normalizeCanvasIdInput; exports.CanvasClient = CanvasClient;
|
|
2063
|
-
//# sourceMappingURL=chunk-
|
|
2063
|
+
//# sourceMappingURL=chunk-27FJDG3Y.cjs.map
|