diff --git a/contracts/supported-universities.json b/contracts/supported-universities.json index 753aa7c..11b530a 100644 --- a/contracts/supported-universities.json +++ b/contracts/supported-universities.json @@ -11,5 +11,6 @@ "uottawa": { "defaultCampus": "uottawa", "campuses": ["uottawa"] }, "brock": { "defaultCampus": "brock", "campuses": ["brock"] }, "ubc": { "defaultCampus": "ubc-vancouver", "campuses": ["ubc-vancouver"] }, - "waterloo": { "defaultCampus": "waterloo-main", "campuses": ["waterloo-main"] } + "waterloo": { "defaultCampus": "waterloo-main", "campuses": ["waterloo-main"] }, + "mcgill": { "defaultCampus": "mcgill-downtown", "campuses": ["mcgill-downtown"] } } diff --git a/docs/CURRENT_LIMITATIONS.md b/docs/CURRENT_LIMITATIONS.md index 615b68f..192e2db 100644 --- a/docs/CURRENT_LIMITATIONS.md +++ b/docs/CURRENT_LIMITATIONS.md @@ -1,5 +1,5 @@ # Current integration limitations -- The MCP surface includes 17 stateless public campus-intelligence tools (10 canonical multi-university tools supporting discovery, building search, places, routing, and gap planning across 13 universities, plus 7 deprecated UTM compatibility aliases) alongside the permissioned private student-context tools. Public tools do not authenticate a Gapwise account and must not be treated as access to a student's private timetable, friends, location, or sync state. +- The MCP surface includes 17 stateless public campus-intelligence tools (10 canonical multi-university tools supporting discovery, building search, places, routing, and gap planning across 14 universities, plus 7 deprecated UTM compatibility aliases) alongside the permissioned private student-context tools. Public tools do not authenticate a Gapwise account and must not be treated as access to a student's private timetable, friends, location, or sync state. - MCP write actions are applied by Gapwise through the queued-action channel; they do not remotely rewrite the primary encrypted private payload. - Broad ChatGPT/Claude support is still a release-validation target rather than a universal support claim. Real OAuth/read/write/revoke behavior depends on the current client/product capabilities and must pass the repository's compatibility matrix before a client is represented as supported. diff --git a/docs/TOOL_CONTRACT.md b/docs/TOOL_CONTRACT.md index e568d94..624ff1b 100644 --- a/docs/TOOL_CONTRACT.md +++ b/docs/TOOL_CONTRACT.md @@ -17,7 +17,7 @@ MCP text `content` is intentionally compact. Exact recurrence, exclusions, rich ## Public campus tools -These tools use public deterministic Gapwise campus data across all 13 supported universities and 15 campus models. They do not authenticate a Gapwise account and do not read a student's private timetable, friends, precise location, or private sync state. +These tools use public deterministic Gapwise campus data across all 14 supported universities and 16 campus models. They do not authenticate a Gapwise account and do not read a student's private timetable, friends, precise location, or private sync state. ### `list_supported_universities` Lists all supported universities and campus editions across the Gapwise platform with capabilities and status. diff --git a/tests/public-campus.test.ts b/tests/public-campus.test.ts index 31b0a57..099aafa 100644 --- a/tests/public-campus.test.ts +++ b/tests/public-campus.test.ts @@ -163,9 +163,10 @@ describe("public campus intelligence adapter", () => { expect(() => validateUniversityAndCampus("harvard")).toThrow( 'Unsupported university "harvard"', ); - expect(() => validateUniversityAndCampus("mcgill")).toThrow( - 'Unsupported university "mcgill"', - ); + expect(validateUniversityAndCampus("mcgill")).toEqual({ + university: "mcgill", + campus: "mcgill-downtown", + }); }); it("rejects unsupported campuses for a given university", () => { @@ -210,8 +211,8 @@ describe("public campus intelligence adapter", () => { }); describe("canonical multi-university programmatic matrix", () => { - it("covers all 13 supported universities in the canonical registry", () => { - expect(CANONICAL_UNIVERSITIES).toHaveLength(13); + it("covers all 14 supported universities in the canonical registry", () => { + expect(CANONICAL_UNIVERSITIES).toHaveLength(14); for (const u of CANONICAL_UNIVERSITIES) { const config = CANONICAL_UNIVERSITY_CAMPUSES[u]; expect(config).toBeDefined();