POLITEMall MCP Server
This server exposes MCP tools for reading a user's POLITEMall/NYP Brightspace course data (enrollment, content, grades, etc.) using an authenticated session.
list_courses — List enrolled courses
get_course_content — Get module/topic table of contents for a course
get_grades — Get grade items and scores for a course
get_announcements — Get course announcements/news
get_calendar_events — Get course calendar events
get_assignments — Get assignment/dropbox folders and due dates
whoami — Verify the authenticated user identity
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@POLITEMall MCP Serverwhat are my current grades?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
politemall-mcp
MCP server for the Singapore polytechnic/ITE learning systems: POLITEMall and NYP (both D2L Brightspace) and STEP (SkillsFuture/short-course enrollment and attendance). Talks directly to each system's own REST API, authenticated with a browser session cookie — no institutional API key or app registration involved.
Live server: https://13-212-182-50.sslip.io — this is the primary way to use
this project: one shared server, each person connected with their own token. The exact
same server (same tools, same code) can also run on your own machine.
The three systems
Each is a separate login with its own session cookie, even though they share SSO — connect whichever you need, any combination:
POLITEMall (
lms.polite.edu.sg) — shared D2L Brightspace instance across polytechnics.NYP (
nyplms.polite.edu.sg) — NYP's own dedicated D2L Brightspace instance.STEP (
stms.polite.edu.sg) — a separate system entirely (not Brightspace): SkillsFuture/short-course enrollment, attendance, and certification records.
Related MCP server: moodle-utn-mcp
Tools
POLITEMall/NYP (D2L) — courseId is an opaque string like politemall:6606
or nyp:12345 returned by list_courses; it encodes which of the two schools the
course belongs to, so just pass it through as-is to the other tools.
Tool | What it does |
| Your enrolled courses, merged across POLITEMall and/or NYP |
| Content items with due dates across every course and connected school in one call — completed and pending |
| D2L-computed overdue items across every course and connected school — a filtered view distinct from |
| Counts of unread/pending activity (discussions, feedback, quizzes) across every course and connected school — a "what's new" feed |
| Your calendar events across every course and connected school in one call, within a date window (default: 7 days ago to 60 days ahead) |
| The course's module/topic tree — one call — with |
| Metadata for a single content topic — a drill-down from |
| The course description/overview content (the "Class Overview"/syllabus) |
| Grade items and your scores |
| Your calculated/adjusted final grade for a course |
| Latest announcements, newest first, plain text, drafts excluded — for one course or (no |
| Course calendar events |
| Assignments and quizzes, soonest due first — instructions, rubric, whether you've submitted, your files and feedback, quiz attempts, plus scored items that have no assignment behind them. One course, or all active courses |
| Read the files an instructor attached to an assignment (PDF, DOCX, XLSX, PPTX, text): list which assignments have attachments, then read one and get its text |
| Your own submission (files, dates, score, feedback) for an assignment folder |
| Quiz list, then your attempt scores/status for one |
| Questions defined for a quiz |
| Drill down forums → topics → actual post content and authors |
| Who is in a course: headcount per role, plus the staff by default (students only with |
| Rubric criteria/levels — by |
| Survey list, then your attempt history for one |
| Questions defined for a survey |
| Group categories and groups, with member counts |
| Your identity on each connected school |
POLITEMall/NYP (D2L), instructor/TA only — same courseIds as above, but
these call grading-permission-gated endpoints. A student's cookie gets a clear
permission error, not their own data, if they call one of these by mistake.
Tool | What it does |
| Every grade item and score for every student — the gradebook view |
| Every student's calculated/adjusted final grade — the gradebook's final-grade column |
| Every student's attempts for a quiz (or one student's, by classlist Identifier) |
| Every student's attempts for a survey (or one student's, by classlist Identifier) |
| Every student's submission for an assignment folder — files, dates, score, grading status |
POLITEMall/NYP (D2L), long-tail escape hatch — the tools above are a curated slice of the
~190 read (GET) routes Valence exposes under Learning Environment; the rest are reachable
without a dedicated tool for each one. Start with the curated tools above — they're
response-shaped and better-documented. Reach for these only when nothing above covers what you
need.
Tool | What it does |
| Search/browse the full route catalog by category or keyword, to find an operation's key and required parameters |
| Invoke any cataloged operation by key — returns D2L's raw JSON response, unshaped. Course-scoped operations take |
STEP — courseId is a GUID string from list_step_courses /
search_step_courses; STEP tools are separate from the D2L ones above since it's
a different data model (training/attendance records, not course content/grades).
Tool | What it does |
| Your enrolled SkillsFuture/short courses |
| Search/browse STEP's full public catalog (thousands of courses) — not just your enrollments |
| Attendance %, grade, and enrolment status for a course |
| Class session timetable — dates, trainer, room, attendance status |
| Portal-wide announcements |
POLITEMall public catalog — a third, separate system again: the marketing
site at politemall.polite.edu.sg, not Brightspace. No login required.
Tool | What it does |
| Search/browse all ~300 modules in the public marketing catalog across every poly/ITE — not your enrollments |
Valence (the actual Brightspace/D2L API) has no endpoint for browsing courses
you're not enrolled in, for any non-admin role — confirmed by testing directly,
not just reading docs: even GET /d2l/api/lp/(version)/courses/(orgUnitId) for a
course we are enrolled in returns 403 Forbidden, since it needs a
course-management permission regular students/staff don't have. The public
catalog above is the closest available substitute for "what modules exist" —
but note its catalogCode values (e.g. D-NP-06030001) are a completely
different ID space from Brightspace courseIds and can't be passed to
get_grades/get_course_content/etc.
Connecting
There's no per-person account system — a token is just a random key that maps to a set of encrypted session cookies, generated by whoever wants to use the server. Nothing ties a token to a name, email, or identity.
Install the cookie sync browser extension — this is the intended way to connect and reconnect; use it rather than the manual DevTools flow on
/connectunless your machine blocks extension installs.Open the extension popup and click Generate a new token (same as
/connect's first step, just done from the extension). It's shown once — save it into your MCP client's config immediately. Lost it? Generate a new one; there's no recovery.Log in normally in your own browser — on the polytechnic corporate network/VPN, since that's the only place SSO works — at whichever of
lms.polite.edu.sg,nyplms.polite.edu.sg,stms.polite.edu.sgyou want, then click the matching button in the extension popup (or Sync all connected schools) to send that cookie to the server.
If extension installs are blocked on your machine, fall back to /connect, which does the same thing via DevTools copy-paste instead.
Cookie expired later? Reconnect that one school (via the extension, or
/connect with your existing token) — your MCP client's config never changes,
since it only holds the token, not the cookies. The server also pings every
connected session every 5 minutes to keep it alive via sliding-expiry, so this
should come up less often than you'd expect. Tokens themselves expire after 90
days regardless of use; that does need a fresh token afterward.
Connecting your MCP client
Claude Code
claude mcp add --transport http politemall https://13-212-182-50.sslip.io/mcp \
--header "Authorization: Bearer YOUR_TOKEN"Add --scope user to make it available in every project, not just the current one.
Claude Desktop
Claude Desktop's built-in connector UI only supports OAuth, not a plain bearer
token, so you bridge it via mcp-remote
in claude_desktop_config.json (%APPDATA%\Claude\claude_desktop_config.json on
Windows):
{
"mcpServers": {
"politemall": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://13-212-182-50.sslip.io/mcp",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer YOUR_TOKEN"
}
}
}
}Requires Node.js installed (for npx), but no admin rights. Fully quit and reopen
Claude Desktop after editing.
Microsoft Copilot Studio
Your agent → Tools → Add a tool → New tool → Model Context Protocol:
Server URL:
https://13-212-182-50.sslip.io/mcpAuthentication: API key → Type: Header → Header name:
Authorization
The value isn't entered here — after saving, the tool shows as "Not connected";
click it → New connection → enter just your raw token (no Bearer prefix
needed — the server accepts either form) as the API key value → Create.
If Copilot Studio ever shows a stale "connection no longer valid" error after a token change, delete and recreate the connection rather than editing it — this is a known Copilot Studio rough edge with MCP connectors, not a server-side issue.
Security notes
Signup is open to anyone with the server URL, but a token alone is useless without a valid session cookie behind it — there's no data to leak until you connect one.
Never put your token in a URL, chat message, or shared doc —
/connect, the extension, and your MCP client config are the only places it should ever be typed.Each session cookie is encrypted at rest (AES-256-GCM) on the server and is only ever used server-side to call that school's API on your behalf.
All
/signup,/sync, and/mcprequests are rate-limited and logged (a short one-way hash of the token, plus timestamp and IP — never the raw token or cookie) for audit purposes.
Architecture
server/
control-plane/ the MCP server (Streamable HTTP) — the only server in this repo
src/
index.ts, local.ts hosted entry point / local entry point (same server, see below)
server.ts builds the MCP server for one caller
api/ D2L + STEP clients: version discovery, routes, pagination, errors
auth/ token store, encryption, rate limiting, keep-alive, per-caller session context
tools/ one file per tool (+ shared helpers and schemas)
utils/ config, audit log, HTML→Markdown, PDF/Office text extraction, deep links
types/ shared types, incl. ToolContext
tests/ mirrors src/ (api/, auth/, tools/, utils/); run with `npm test`
docker-compose.yml, Caddyfile
deploy/ AWS provisioning notes/scripts for the hosted server
extension/ browser extension for one-click cookie syncTools never know where a caller's sessions live: they receive a ToolContext
(types/tool-context.ts), so the hosted server and a local run expose the identical
tool set. See deploy/README.md for how the server is provisioned
and operated on AWS.
Running it locally
There is one server, and it runs the same tools locally as in the cloud:
cd server/control-plane
npm install
npm run local # builds, then starts on http://localhost:3000 (no AWS needed)npm run local generates a master key into server/control-plane/data/ on first start and
keeps encrypted sessions there. Connect the same way as the hosted server, using the manual
steps on http://localhost:3000/connect (the browser extension is set up for the hosted
server only), then point your MCP client at http://localhost:3000/mcp with your token as a
bearer token. Sessions expire periodically; reconnect the same way.
Tests: npm test (compiles src/ and tests/, then runs everything with Node's test runner).
Available Tools
7 toolsget_announcementsGet announcementsA
Get news/announcements posted in a course.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The course's orgUnitId, from list_courses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure burden, but it only says 'Get', implying a read-only operation. It does not mention whether only published announcements are returned, ordering, pagination, permission requirements, or the shape of the result, leaving meaningful gaps for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no fluff. The phrase 'news/announcements' clarifies synonyms without adding unnecessary length, and the core resource is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool, the description is adequate but not complete: it omits what the response contains and whether the tool requires any special context. Given no output schema and no annotations, a bit more detail about returned data would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single courseId param already documents its meaning and source via list_courses. The description adds no parameter-level nuance beyond the schema; baseline 3 is warranted because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('news/announcements posted in a course'), which clearly distinguishes it from siblings like get_grades or get_assignments. It also aligns with the tool name and title without being tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: call this tool when you need course announcements. However, it provides no explicit when-to-use guidance or exclusion versus alternatives such as get_course_content, which could also conceivably surface announcements. The interaction with siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assignmentsGet assignmentsB
Get dropbox/assignment folders and due dates for a course.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The course's orgUnitId, from list_courses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral disclosure burden. It implies a read operation but does not mention what the returned data looks like, whether it can be empty, authentication expectations, or any side effects. This is a meaningful gap for a tool with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. Every word contributes to identifying the resource and scope, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one well-documented parameter, so the description covers the basic call context. However, since there is no output schema, the description could usefully clarify the expected return shape beyond 'folders and due dates', and it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the sole parameter courseId is already documented as the orgUnitId from list_courses. The description does not add further parameter-level meaning, but it also does not need to because the schema already provides adequate semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Get'), a specific resource ('dropbox/assignment folders and due dates'), and a scope ('for a course'). This distinguishes it from sibling tools like get_grades and get_announcements without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as get_course_content or get_calendar_events. The phrase 'for a course' implies context, but the description does not state when this tool is the right choice or when it is not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendar_eventsGet calendar eventsB
Get calendar events for a course.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The course's orgUnitId, from list_courses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description itself must signal behavior; 'Get' clearly implies a read-only retrieval within the course scope. However, it does not disclose what the returned events look like, whether date-range filtering is available, pagination, or authentication expectations, so transparency is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler words. Every word carries meaning, and it is easy to scan quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with no output schema, the description provides the essential what and scope, and the schema covers the parameter. It is less complete than ideal because it offers no usage guidance or return-value context and has no annotations to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the courseId property already explains that it is the course's orgUnitId from list_courses. The description's 'for a course' reinforces that single parameter but adds no new semantic information beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get'), a specific resource ('calendar events'), and a scope ('for a course'), so an agent can tell it retrieves course-calendar data rather than content, grades, or announcements. It doesn't explicitly contrast it with sibling tools, so it misses the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to call this tool instead of a sibling such as get_course_content or get_assignments. The phrase 'for a course' indicates a required parameter but provides no selection heuristics or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_contentGet course contentA
Get the module/topic table of contents for a course.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The course's orgUnitId, from list_courses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. 'Get' implies read-only, and 'module/topic table of contents' indicates the response is a structural outline, but the description does not disclose side effects, permission requirements, or nesting/pagination behavior. This is acceptable for a simple get but leaves some traits unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with a clear verb and object, no filler or redundant phrasing. It front-loads the action and resource effectively.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one required parameter, the schema is complete, and the description states the nature of the output as a module/topic table of contents. Without an output schema, the description does not detail the exact return structure, but for a basic read-only content outline this is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already fully describes courseId, including its source from list_courses. The description's phrase 'for a course' merely echoes the schema without adding new parameter semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and a concrete resource ('module/topic table of contents for a course'), making it immediately distinguishable from siblings like get_grades and get_assignments. The phrase 'table of contents' clearly narrows the scope to a structural overview, not the course content itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving course structure but gives no explicit guidance on when to use it versus alternatives. It also doesn't mention in the description that courseId comes from list_courses, though that is documented in the schema. Usage is inferable rather than explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gradesGet gradesB
Get your grade items and scores for a course.
| Name | Required | Description | Default |
|---|---|---|---|
| courseId | Yes | The course's orgUnitId, from list_courses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only says the tool fetches grade data; it does not disclose response shape, pagination behavior, error cases, authorization needs, or explicitly affirm that it is read-only beyond the word 'Get'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence states the action, object, and scope with no filler. It avoids repeating the tool name and earns every word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter getter, the description names the returned concept (grade items and scores), and the schema fully documents the parameter. It does not describe edge cases or output formatting, but nothing critical is missing for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already explains courseId as the orgUnitId from list_courses. The description adds no parameter-level meaning, so it meets the baseline but does not go beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('grade items and scores') scoped to a course, which distinguishes it from siblings like get_assignments and get_course_content. 'Your' also clarifies that this returns the calling user's own grade data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. The schema mentions that courseId comes from list_courses, but the description itself provides no prerequisites, exclusions, or alternative tool routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coursesList coursesA
List the courses you are enrolled in on POLITEMall.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It merely states the action without mentioning whether it is read-only, what the return format is, or any side effects. For a listing operation, read-only is implied, but the description does not confirm it or describe the output shape, which is a gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the action and scope. There is no fluff, and it is appropriately sized for a simple tool with no parameters or complex behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward list tool with no parameters and no output schema, the description is minimal but functional. It tells the agent what it lists, but does not specify what a course entry includes or whether the list is sorted, which could be relevant. Given the simplicity, this is acceptable but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100% (empty properties). Baseline for 0 parameters is 4, and the description adds nothing about parameters because there are none, which is appropriate. No compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' and clearly identifies the resource: courses the user is enrolled in on POLITEMall. This distinguishes it from sibling tools that focus on content, grades, announcements, etc., so an agent can infer its role without additional detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description only states what it does, leaving the agent to infer context from the tool name and siblings. There is no mention of scenarios like 'use this to get an overview of your courses' or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiWhoamiA
Get the currently authenticated POLITEMall user's identity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It clearly states this is a read-only identity lookup, which implies no side effects. However, it doesn't disclose details like whether the identity includes roles, email, or other attributes, or whether authentication is required. For a simple identity tool, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, clear sentence that front-loads the verb and resource. No wasted words, no repetition of the title. It earns its place entirely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description is nearly complete. It tells the agent what the tool returns (the identity of the authenticated user). The only minor gap is not specifying the shape of the identity object, but without an output schema, a bit more detail could help. Still, for such a simple tool, this is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description doesn't need to explain parameter semantics. The baseline for 0 params is 4, and the description correctly focuses on the output concept (the user's identity) rather than inputs. No deduction needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and a clear resource ('the currently authenticated POLITEMall user's identity'). It clearly distinguishes itself from sibling tools that fetch courses, grades, announcements, etc., by focusing on the authenticated user's identity rather than any domain data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: call it when you need the current user's identity, which is a common prerequisite for personalization or authorization. It doesn't explicitly state when not to use it or name alternatives, but the sibling list makes the distinction clear enough. A small deduction for not explicitly stating exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
get_announcements - First observed
get_assignments - First observed
get_calendar_events - First observed
get_course_content - First observed
get_grades - First observed
list_courses - First observed
whoami
TDQS
Scored across 7 tools
Each tool targets a distinct resource type: courses, content, grades, announcements, calendar events, assignments, and user identity. There is no overlap or ambiguity between them.
All tools follow a consistent verb_noun snake_case pattern (list_courses, get_course_content, get_grades), with 'whoami' being a standard exception. The naming is predictable and readable.
Seven tools is well within the ideal 3-15 range and appropriately covers the core student-facing features of an LMS without unnecessary bulk.
The surface covers the main read-only information needs: enrollment, content, grades, announcements, calendar, and assignments. Missing discussion forums or quizzes are minor gaps for a read-only student portal.
Maintenance
Related MCP Connectors
Read and author HiveLearn courses, events, quizzes, certificates, resources, leaderboards, tracks.
Unofficial NTNU course data: search, timetables, grades, course info, and exam logistics.
Read and manage courses, members, orders, events, posts, and settings for Loopwise-powered sites.
Manage your Canvas coursework with quick access to courses, assignments, and grades. Track upcomin…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables reading and writing Canvas LMS course content using browser session cookies, without needing an API key.MIT
- FlicenseNot gradedqualityBmaintenanceEnables browser-based login to approved UTN Moodle sites and read-only access to the user's profile, course list, and course activities via local Chromium automation.2-
- FlicenseAqualityCmaintenanceEnables local, read-only access to SMU's D2L Brightspace eLearn, allowing users to list courses, browse weekly modules and documents, search content, retrieve metadata, and download files after authenticating through Chrome.111-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to access the Polotsk State Economic College Moodle platform, including course catalogs, course contents, modules, files, assignments, forums, and tests, using session or token authentication.1MIT