Skip to main content
Glama
GuanmingQiao

POLITEMall MCP Server

by GuanmingQiao

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

list_courses

Your enrolled courses, merged across POLITEMall and/or NYP

get_due_items

Content items with due dates across every course and connected school in one call — completed and pending

get_overdue_items

D2L-computed overdue items across every course and connected school — a filtered view distinct from get_due_items

get_recent_updates

Counts of unread/pending activity (discussions, feedback, quizzes) across every course and connected school — a "what's new" feed

get_my_calendar_events

Your calendar events across every course and connected school in one call, within a date window (default: 7 days ago to 60 days ahead)

get_course_content

The course's module/topic tree — one call — with typeFilter (file/link/html/video), moduleTitle and maxDepth to keep it small; rich text as Markdown

get_content_topic

Metadata for a single content topic — a drill-down from get_course_content

get_course_overview

The course description/overview content (the "Class Overview"/syllabus)

get_grades

Grade items and your scores

get_my_final_grade

Your calculated/adjusted final grade for a course

get_announcements

Latest announcements, newest first, plain text, drafts excluded — for one course or (no courseId) across all your active courses; count limits it

get_calendar_events

Course calendar events

get_assignments

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

get_assignment_files

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

get_my_dropbox_submission

Your own submission (files, dates, score, feedback) for an assignment folder

get_quizzes / get_quiz_attempts

Quiz list, then your attempt scores/status for one

get_quiz_questions

Questions defined for a quiz

get_discussion_forums / get_discussion_topics / get_discussion_posts

Drill down forums → topics → actual post content and authors

get_classlist

Who is in a course: headcount per role, plus the staff by default (students only with includeStudents, searchTerm to find someone)

get_rubrics

Rubric criteria/levels — by rubricId, or list rubrics attached to a discussion/dropbox/etc. object

get_surveys / get_survey_attempts

Survey list, then your attempt history for one

get_survey_questions

Questions defined for a survey

get_groups

Group categories and groups, with member counts

whoami

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

get_class_grades

Every grade item and score for every student — the gradebook view

get_all_final_grades

Every student's calculated/adjusted final grade — the gradebook's final-grade column

get_quiz_results

Every student's attempts for a quiz (or one student's, by classlist Identifier)

get_survey_results

Every student's attempts for a survey (or one student's, by classlist Identifier)

get_dropbox_submissions

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

list_d2l_operations

Search/browse the full route catalog by category or keyword, to find an operation's key and required parameters

call_d2l_operation

Invoke any cataloged operation by key — returns D2L's raw JSON response, unshaped. Course-scoped operations take courseId; operations not tied to one course take school instead. Read-only; routes that return binary file content are rejected

STEPcourseId 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

list_step_courses

Your enrolled SkillsFuture/short courses

search_step_courses

Search/browse STEP's full public catalog (thousands of courses) — not just your enrollments

get_step_course_detail

Attendance %, grade, and enrolment status for a course

get_step_timetable

Class session timetable — dates, trainer, room, attendance status

get_step_announcements

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_politemall_catalog

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.

  1. Install the cookie sync browser extension — this is the intended way to connect and reconnect; use it rather than the manual DevTools flow on /connect unless your machine blocks extension installs.

  2. 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.

  3. 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.sg you 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 → ToolsAdd a toolNew toolModel Context Protocol:

  • Server URL: https://13-212-182-50.sslip.io/mcp

  • Authentication: 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 /mcp requests 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 sync

Tools 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 tools
get_announcementsGet announcementsA

Get news/announcements posted in a course.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesThe course's orgUnitId, from list_courses

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesThe course's orgUnitId, from list_courses

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesThe course's orgUnitId, from list_courses

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesThe course's orgUnitId, from list_courses

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseIdYesThe course's orgUnitId, from list_courses

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv0.1.0
    • First observedget_announcements
    • First observedget_assignments
    • First observedget_calendar_events
    • First observedget_course_content
    • First observedget_grades
    • First observedlist_courses
    • First observedwhoami

TDQS

A3.9/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

Seven tools is well within the ideal 3-15 range and appropriately covers the core student-facing features of an LMS without unnecessary bulk.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers