canvas-parent-mcp 1.0.0 → 1.0.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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/bundle.js +19 -10
- package/dist/config.js +33 -9
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"metadata": {
|
|
9
9
|
"description": "MCP server for Canvas LMS (Instructure) — courses, grades, assignments, announcements, planner, conversations, files",
|
|
10
|
-
"version": "1.0.
|
|
10
|
+
"version": "1.0.2"
|
|
11
11
|
},
|
|
12
12
|
"plugins": [
|
|
13
13
|
{
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"displayName": "Canvas LMS",
|
|
16
16
|
"source": "./",
|
|
17
17
|
"description": "Canvas LMS (Instructure) MCP server for Claude — student/observer access via natural language",
|
|
18
|
-
"version": "1.0.
|
|
18
|
+
"version": "1.0.2",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "canvas-parent-mcp",
|
|
3
3
|
"displayName": "Canvas LMS",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.2",
|
|
5
5
|
"description": "Canvas LMS (Instructure) MCP server for Claude — courses, grades, assignments, announcements, planner, conversations, files",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Chris Hall",
|
package/dist/bundle.js
CHANGED
|
@@ -30860,8 +30860,17 @@ var StdioServerTransport = class {
|
|
|
30860
30860
|
};
|
|
30861
30861
|
|
|
30862
30862
|
// src/config.ts
|
|
30863
|
+
function readVar(env, key) {
|
|
30864
|
+
const raw = env[key];
|
|
30865
|
+
if (typeof raw !== "string") return void 0;
|
|
30866
|
+
const trimmed = raw.trim();
|
|
30867
|
+
if (trimmed.length === 0) return void 0;
|
|
30868
|
+
if (trimmed === "undefined" || trimmed === "null") return void 0;
|
|
30869
|
+
if (/^\$\{[^}]*\}$/.test(trimmed)) return void 0;
|
|
30870
|
+
return trimmed;
|
|
30871
|
+
}
|
|
30863
30872
|
function loadAccount(env = process.env) {
|
|
30864
|
-
const baseUrl = env
|
|
30873
|
+
const baseUrl = readVar(env, "CANVAS_BASE_URL");
|
|
30865
30874
|
if (!baseUrl) {
|
|
30866
30875
|
throw new Error(
|
|
30867
30876
|
"Missing required env var: CANVAS_BASE_URL. Set CANVAS_BASE_URL (e.g. https://cms.instructure.com) plus an auth mode."
|
|
@@ -30871,13 +30880,13 @@ function loadAccount(env = process.env) {
|
|
|
30871
30880
|
throw new Error(`CANVAS_BASE_URL must be an https URL, got: '${baseUrl}'`);
|
|
30872
30881
|
}
|
|
30873
30882
|
const cleanBaseUrl = baseUrl.replace(/\/$/, "");
|
|
30874
|
-
const name = env
|
|
30875
|
-
const token = env
|
|
30876
|
-
const username = env
|
|
30877
|
-
const password = env
|
|
30878
|
-
const clientId = env
|
|
30879
|
-
const clientSecret = env
|
|
30880
|
-
const refreshToken = env
|
|
30883
|
+
const name = readVar(env, "CANVAS_NAME") ?? new URL(cleanBaseUrl).host;
|
|
30884
|
+
const token = readVar(env, "CANVAS_TOKEN");
|
|
30885
|
+
const username = readVar(env, "CANVAS_USERNAME");
|
|
30886
|
+
const password = readVar(env, "CANVAS_PASSWORD");
|
|
30887
|
+
const clientId = readVar(env, "CANVAS_CLIENT_ID");
|
|
30888
|
+
const clientSecret = readVar(env, "CANVAS_CLIENT_SECRET");
|
|
30889
|
+
const refreshToken = readVar(env, "CANVAS_REFRESH_TOKEN");
|
|
30881
30890
|
const oauthSet = [clientId, clientSecret, refreshToken].filter((v) => !!v);
|
|
30882
30891
|
const hasFullOAuth = oauthSet.length === 3;
|
|
30883
30892
|
const hasPartialOAuth = oauthSet.length > 0 && oauthSet.length < 3;
|
|
@@ -30930,7 +30939,7 @@ function loadAccount(env = process.env) {
|
|
|
30930
30939
|
clientId,
|
|
30931
30940
|
clientSecret,
|
|
30932
30941
|
refreshToken,
|
|
30933
|
-
accessToken: env
|
|
30942
|
+
accessToken: readVar(env, "CANVAS_ACCESS_TOKEN")
|
|
30934
30943
|
};
|
|
30935
30944
|
}
|
|
30936
30945
|
throw new Error(
|
|
@@ -31634,7 +31643,7 @@ try {
|
|
|
31634
31643
|
}
|
|
31635
31644
|
var account = loadAccount();
|
|
31636
31645
|
var client = new CanvasClient(account);
|
|
31637
|
-
var server = new McpServer({ name: "canvas", version: "1.0.
|
|
31646
|
+
var server = new McpServer({ name: "canvas", version: "1.0.2" });
|
|
31638
31647
|
registerProfileTools(server, client);
|
|
31639
31648
|
registerObserveeTools(server, client);
|
|
31640
31649
|
registerCourseTools(server, client);
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read an env var, trim whitespace, and treat as unset for several "looks-set
|
|
3
|
+
* but-isn't" inputs that some MCP hosts pass through when a value really is
|
|
4
|
+
* undefined:
|
|
5
|
+
* - empty string / whitespace-only
|
|
6
|
+
* - literal "undefined" / "null" (Claude Desktop stringifies undefined
|
|
7
|
+
* user_config refs to the 9-letter string "undefined", which would
|
|
8
|
+
* otherwise be sent to upstream APIs as a Bearer token and rejected)
|
|
9
|
+
* - unsubstituted shell placeholder, e.g. "${CANVAS_TOKEN}" or
|
|
10
|
+
* "${user_config.canvas_token}" (other hosts leave the placeholder intact)
|
|
11
|
+
*/
|
|
12
|
+
function readVar(env, key) {
|
|
13
|
+
const raw = env[key];
|
|
14
|
+
if (typeof raw !== 'string')
|
|
15
|
+
return undefined;
|
|
16
|
+
const trimmed = raw.trim();
|
|
17
|
+
if (trimmed.length === 0)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (trimmed === 'undefined' || trimmed === 'null')
|
|
20
|
+
return undefined;
|
|
21
|
+
if (/^\$\{[^}]*\}$/.test(trimmed))
|
|
22
|
+
return undefined;
|
|
23
|
+
return trimmed;
|
|
24
|
+
}
|
|
1
25
|
export function loadAccount(env = process.env) {
|
|
2
|
-
const baseUrl = env
|
|
26
|
+
const baseUrl = readVar(env, 'CANVAS_BASE_URL');
|
|
3
27
|
if (!baseUrl) {
|
|
4
28
|
throw new Error('Missing required env var: CANVAS_BASE_URL. ' +
|
|
5
29
|
'Set CANVAS_BASE_URL (e.g. https://cms.instructure.com) plus an auth mode.');
|
|
@@ -8,13 +32,13 @@ export function loadAccount(env = process.env) {
|
|
|
8
32
|
throw new Error(`CANVAS_BASE_URL must be an https URL, got: '${baseUrl}'`);
|
|
9
33
|
}
|
|
10
34
|
const cleanBaseUrl = baseUrl.replace(/\/$/, '');
|
|
11
|
-
const name = env
|
|
12
|
-
const token = env
|
|
13
|
-
const username = env
|
|
14
|
-
const password = env
|
|
15
|
-
const clientId = env
|
|
16
|
-
const clientSecret = env
|
|
17
|
-
const refreshToken = env
|
|
35
|
+
const name = readVar(env, 'CANVAS_NAME') ?? new URL(cleanBaseUrl).host;
|
|
36
|
+
const token = readVar(env, 'CANVAS_TOKEN');
|
|
37
|
+
const username = readVar(env, 'CANVAS_USERNAME');
|
|
38
|
+
const password = readVar(env, 'CANVAS_PASSWORD');
|
|
39
|
+
const clientId = readVar(env, 'CANVAS_CLIENT_ID');
|
|
40
|
+
const clientSecret = readVar(env, 'CANVAS_CLIENT_SECRET');
|
|
41
|
+
const refreshToken = readVar(env, 'CANVAS_REFRESH_TOKEN');
|
|
18
42
|
const oauthSet = [clientId, clientSecret, refreshToken].filter((v) => !!v);
|
|
19
43
|
const hasFullOAuth = oauthSet.length === 3;
|
|
20
44
|
const hasPartialOAuth = oauthSet.length > 0 && oauthSet.length < 3;
|
|
@@ -70,7 +94,7 @@ export function loadAccount(env = process.env) {
|
|
|
70
94
|
clientId: clientId,
|
|
71
95
|
clientSecret: clientSecret,
|
|
72
96
|
refreshToken: refreshToken,
|
|
73
|
-
accessToken: env
|
|
97
|
+
accessToken: readVar(env, 'CANVAS_ACCESS_TOKEN'),
|
|
74
98
|
};
|
|
75
99
|
}
|
|
76
100
|
throw new Error('Missing Canvas auth config. Set one of: CANVAS_TOKEN (personal access token), ' +
|
package/dist/index.js
CHANGED
|
@@ -29,7 +29,7 @@ import { registerDiscussionTools } from './tools/discussions.js';
|
|
|
29
29
|
import { registerFileTools } from './tools/files.js';
|
|
30
30
|
const account = loadAccount();
|
|
31
31
|
const client = new CanvasClient(account);
|
|
32
|
-
const server = new McpServer({ name: 'canvas', version: '1.0.
|
|
32
|
+
const server = new McpServer({ name: 'canvas', version: '1.0.2' });
|
|
33
33
|
registerProfileTools(server, client);
|
|
34
34
|
registerObserveeTools(server, client);
|
|
35
35
|
registerCourseTools(server, client);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "canvas-parent-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"mcpName": "io.github.chrischall/canvas-parent-mcp",
|
|
5
5
|
"description": "Canvas LMS (Instructure) MCP server — student/observer read access with optional file 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/canvas-parent-mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.2",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "canvas-parent-mcp",
|
|
14
|
-
"version": "1.0.
|
|
14
|
+
"version": "1.0.2",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|