icampus-mcp
Reads your own SKKU iCampus data through Canvas's API, providing access to courses, tasks, assignments, announcements, lectures, attendance, and grades.
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., "@icampus-mcpWhat assignments are due this week?"
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.
skku-icampus
Keeps a copy of your own SKKU iCampus data and serves it to other programs over a REST API, and to AI assistants over MCP. That covers tasks and deadlines, assignment submission status, announcements, lectures and attendance, and grades.
icampus (FastAPI :9013) logs in by itself, syncs 4×/day, stores everything in SQLite
icampus-mcp (:8724/mcp) MCP tools; only talks to the API, never sees your passwordUnofficial, not affiliated with Sungkyunkwan University. It only reads your own account; follow your university's rules when you use it.
How it works
Login. A headless Chromium signs in through the normal SSO page, but only when the saved session has expired. Everything after that is plain GET requests: Canvas
/api/v1and the LearningX JSON API that My Page, 강의콘텐츠 and 출결현황 use themselves (notes).Read-only. The browser works from an allowlist of pages and never loads item pages, because opening a lecture item in iCampus marks it complete. It never submits anything, starts quizzes or marks anything read.
Careful with logins. At most 3 password logins a day. A rejected password, a locked account or a password-expiry notice stops automatic logins until you retry with an admin token (
POST /api/v1/sync?retry_login=true).Schedule. Syncs run at 07:30, 12:30, 18:00 and 22:30 KST (±10 min), plus on request. They show up as normal account activity in Canvas.
Failures. If part of a sync fails, the old data for that part is kept and its
synced_atstays at the last good sync.staleturns true once that is older than 12 hours (ICAMPUS_STALE_HOURS), and/api/v1/statusshows per-run errors. An item that drops off the iCampus to-do list is not marked "done".
Related MCP server: MJC MCP Server
Run it locally
uv sync
uv run playwright install chromium
cp .env.example .env && chmod 600 .env # your 킹고ID + tokens (openssl rand -hex 24)
uv run icampus sync --headed # one sync, watching the browser
uv run icampus serve # API on 127.0.0.1:9013 (+ the schedule)
uv run pytestSwagger UI: http://127.0.0.1:9013/docs. icampus probe is a one-off read-only check of what the
iCampus pages load. It writes its report to var/probe/, which is gitignored and holds personal data.
REST API
Send Authorization: Bearer <token> on every call. Tokens come from ICAMPUS_API_TOKENS
(label:token,...). List responses look like {synced_at, stale, count, items}; when a list is cut
short they add total and truncated. course accepts an ID, a course code or part of a name.
Endpoint | Notes |
| no auth |
| last runs, freshness per dataset, login state, next run |
| Returns 202 started, 409 running, 429 cooldown or 423 blocked. |
| codes, instructors, current grade |
| merged to-do list: |
|
|
|
|
|
|
|
|
| everything as one JSON document |
A few fields to read carefully:
in_remaining_listis what My Page shows. It does not mean you haven't submitted.completedandsubmissionare only filled in when iCampus reported them.nullmeans unknown.attendanceis one ofattendance(present),late,absentornone(not decided yet).
MCP
Tools: sync_status, list_courses, list_tasks, list_announcements, read_announcement,
list_lectures, get_grades, refresh. All are read-only except refresh, which asks for a sync.
# over HTTP (icampus-mcp --http), with a token from ICAMPUS_MCP_TOKENS
claude mcp add --transport http icampus http://<server>:8724/mcp --header "Authorization: Bearer <token>"
# or locally over stdio against the API
claude mcp add icampus --env ICAMPUS_MCP_API_URL=http://<server>:9013 \
--env ICAMPUS_MCP_API_TOKEN=<api token> -- uv run --directory "$PWD" icampus-mcpOver HTTP, a request gets in with either a bearer token from ICAMPUS_MCP_TOKENS or a Cloudflare
Access JWT. Without either one configured, the server won't start.
The Access route is how claude.ai and the mobile apps reach it:
Put a public hostname behind an Access app with Managed OAuth, and proxy it to
:8724.Set these variables:
ICAMPUS_MCP_ACCESS_TEAM, for examplemyteam.cloudflareaccess.com;ICAMPUS_MCP_ACCESS_AUD, the app's AUD tag or tags, comma-separated;ICAMPUS_MCP_ACCESS_EMAILS, the emails allowed in;ICAMPUS_MCP_ALLOWED_HOSTS, which must include the public hostname.
Deploy with Docker
cp .env.example .env && chmod 600 .env # fill it in
docker compose up -d --build # ports on 127.0.0.1 onlyTo expose the ports on a server, copy compose.homelab.example.yaml to compose.homelab.yaml
(gitignored), put in your addresses, and add COMPOSE_FILE=compose.yaml:compose.homelab.yaml to
.env. Keep the API off the public internet, and put only the MCP port behind Cloudflare Access.
The MCP container never gets your SSO password.
License
MIT — see LICENSE.
Repo
Path | What |
| the program ( |
| how iCampus behaves: login flow, endpoints, side effects |
| offline tests; one runs a local Chromium against a fake login page |
var/ (the database, saved session, probe output), .env and private/ hold personal data and are
gitignored.
Available Tools
8 toolsget_gradesBRead-only
Course totals and per-assignment scores as Canvas shows them to you (hidden grades stay hidden).
| Name | Required | Description | Default |
|---|---|---|---|
| course | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the description does not need to repeat that. It adds useful behavioral context beyond the annotation: the result reflects the Canvas user-facing view and hidden grades remain hidden. This is meaningful additional transparency.
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, tightly-worded sentence with no filler. It front-loads the core purpose and adds the most important caveat about hidden grades in a compact clause.
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 low-complexity read-only tool, the description covers the output content and the hidden-grade behavior. However, the ambiguous optional course parameter and lack of any usage direction leave an important gap for an agent deciding how to invoke the tool 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?
The schema has 0% description coverage for the single optional 'course' parameter, and the description does not compensate. It never explains how to specify a course (ID? name?), what null means, or whether the parameter filters results to one course or returns all courses.
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 clearly identifies the resource (grades) and the scope (course totals and per-assignment scores), and adds a distinctive behavioral nuance ('as Canvas shows them to you'). It does not use an explicit verb, but the tool name supplies that, and the domain is clearly separated from siblings like announcements, tasks, and lectures.
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 this is the tool to use when you need grades as the student sees them, including the hidden-grade caveat. However, it gives no explicit guidance about when to use it over alternatives, what the optional 'course' parameter means, or what happens when it is omitted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_announcementsARead-only
Recent course announcements (title, date, author, read state, a short preview), newest first.
Use read_announcement with an id for the full text.
| Name | Required | Description | Default |
|---|---|---|---|
| course | No | ||
| since_days | No | ||
| unread_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds meaningful behavior beyond that: it returns a short preview rather than full text, orders results newest first, and includes author/read state. It does not detail pagination or filtering side effects, but the read-only annotation lowers the burden.
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 two sentences with no filler. The first sentence front-loads the output shape and ordering; the second sentence provides the crucial routing to read_announcement. Every sentence earns its place.
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 description covers what the tool returns and how to get full text, and annotations cover safety. However, it omits the semantics of the optional filters, especially course and unread_only, and does not state whether course null means all courses or a required context. For an agent to invoke it correctly beyond defaults, it must infer too much.
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 0% and the parameters (course, since_days, unread_only) are only named in the schema with defaults. The description barely compensates: 'Recent' hints at since_days and 'course announcements' hints at course, but it never explains the meaning of course, the time window behavior, or the unread_only filter. This is a significant gap for a 3-parameter tool.
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 'list' via the tool name and resource: recent course announcements, including exact fields (title, date, author, read state, preview) and ordering (newest first). It explicitly differentiates from the sibling tool read_announcement by noting that full text is available there.
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 gives explicit routing guidance: 'Use read_announcement with an `id` for the full text.' This tells the agent when to prefer the sibling alternative, satisfying the when-not condition. It also implies the tool is for previews and recent items, which is clear enough for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coursesARead-only
This term's courses: id, code (e.g. CSE1001), name, instructors and the current grade if visible.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds useful scoping ('this term's courses') and the 'if visible' caveat on grades, but does not disclose ordering, pagination, or what determines grade visibility.
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 the core resource ('This term's courses') first, followed by concrete field examples. No filler or repetition.
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 parameterless, read-only list tool with no output schema, the description is sufficiently complete: it identifies the resource, the scope, and the return fields including the grade visibility condition. There is no hidden complexity requiring more detail.
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 complete, so parameter semantics are inherently simple. The description adds value by explaining what data will be returned, which is the meaningful semantic content for an empty 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 clearly states the tool returns this term's courses, with specific fields like id, code, name, instructors, and grade. It distinguishes the resource (courses) from sibling tools like list_announcements and list_lectures, though it does not explicitly contrast itself with get_grades.
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 about when to use this tool versus alternatives such as get_grades or list_tasks. The context implies it is for listing courses, but there are no explicit conditions, exclusions, or sibling routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_lecturesARead-only
Lecture videos/materials with completion and attendance as iCampus shows them, soonest deadline first. By default: items already open, not completed, whose deadline (incl. late period) has not passed.
Args:
course: course ID, code or part of the name.
week: week number (1 = 1주차).
kind: e.g. video or material.
incomplete_only: only items reported as not completed (unknown completion is left out).
include_upcoming: also items that have not opened yet.
include_overdue: also items whose deadline has passed (missed, possibly still viewable).
include_attendance: add each course's official per-lesson attendance summary.
limit: maximum items returned.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| week | No | ||
| limit | No | ||
| course | No | ||
| include_overdue | No | ||
| incomplete_only | No | ||
| include_upcoming | No | ||
| include_attendance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the read-only/hints: soonest-deadline-first sorting, default filtering, unknown-completion exclusion, overdue items 'possibly still viewable', and per-lesson attendance summaries. This goes beyond what annotations alone convey.
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 front-loaded with the core purpose and default behavior, followed by a compact, well-formatted Args list. Every line adds useful information with no filler or repetition of the tool name.
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 description covers defaults, ordering, parameter meanings, and edge-case behavior well. It does not describe the raw response shape, but no output schema exists; still, the information provided is sufficient for an agent to select and invoke the tool 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 0%, but the description documents all 8 parameters with valuable semantics: course accepts ID/code/partial name, week is 1-based, kind is exemplified, incomplete_only excludes unknown completion, and include_overdue explains missed items may still be viewable. It fully compensates for the schema's lack of descriptions.
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 and resource ('Lecture videos/materials') and adds meaningful scope: completion, attendance, and iCampus presentation. It is clearly distinguishable from sibling tools like list_announcements, list_courses, and list_tasks by focusing on lectures with deadline ordering.
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 default filter is explicitly stated: items already open, not completed, and with a deadline that has not passed. This gives clear context for when the tool is appropriate, though it does not explicitly name alternatives or say when to avoid using it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksARead-only
Things to do across courses, soonest first: the iCampus remaining list merged with Canvas assignment/quiz submission status and lecture completion. Items with no due date come last.
Args:
course: course ID, code (CSE1001) or part of the name. Omit for all courses.
kind: only this kind of item.
due_within_days: items due in the next N days (items without a due date are always included).
past_days: also include items whose due date passed in the last N days (overdue/late window).
include_done: also include submitted/completed items.
limit: maximum items returned; `total` shows how many matched when truncated.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| course | No | ||
| past_days | No | ||
| include_done | No | ||
| due_within_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing sorting order ('soonest first', 'Items with no due date come last'), aggregation behavior, the overdue/late window via past_days, inclusion semantics for include_done, and truncation behavior via limit and total. These are meaningful behavioral details not present in the annotations.
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 front-loaded with the core purpose and sorting behavior, followed by a compact Args list. Every line adds necessary semantic value, and there is no filler or repetition of schema defaults.
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 six-parameter list tool with no output schema, the description covers all parameters, sorting, filtering, and truncation semantics. It could add a sentence about the general return shape, but the mention of `total` and the list-oriented nature make it sufficiently complete for correct invocation.
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 0%, so the description carries the full burden, and it succeeds. Every parameter is explained with practical meaning: course accepts ID/code/name, due_within_days always includes no-due-date items, past_days defines the overdue window, include_done covers submitted/completed items, and limit explains total when truncated.
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 opens with a specific, informative summary: 'Things to do across courses, soonest first' and names the exact sources (iCampus remaining list merged with Canvas assignment/quiz submission status and lecture completion). This clearly identifies the resource and behavior, and it is easy to distinguish from siblings like list_announcements, list_lectures, and get_grades.
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 intended use is implied by the summary and parameters, but the description never explicitly states when to prefer this tool over siblings or when not to use it. There is no exclusion guidance, such as 'for course metadata use list_courses' or 'for lecture-specific content use list_lectures.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_announcementARead-only
Full text of one announcement (by the numeric id from list_announcements).
| Name | Required | Description | Default |
|---|---|---|---|
| announcement_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds value by stating the tool returns the full text rather than a summary, but it does not describe response shape or edge cases. This is adequate but not richly transparent beyond the annotations.
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 short sentence, front-loaded with the core purpose ('Full text of one announcement'), and the id provenance is appended efficiently. No wasted words.
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 single-parameter read-only tool, the description gives all necessary calling context: what the tool returns, where the id comes from, and that it is read-only via annotations. The lack of an output schema is acceptable because the description already states the result is the announcement's full text.
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 0%, yet the description compensates fully by explaining that the parameter is the numeric id coming from list_announcements, and clarifies the string-typed field is expected to carry a numeric value. This is exactly the kind of semantic bridge an agent needs.
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 and resource: reads the full text of one announcement. It distinguishes itself from the sibling list_announcements by emphasizing 'one announcement' with 'full text', and even specifies the id source, so an agent can tell exactly what this tool is for.
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 clearly implies usage after list_announcements has provided the announcement id, and it clarifies this tool is for retrieving full text rather than listing. It does not explicitly state when not to use it, but for a simple single-id read tool the context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refreshAIdempotent
Ask the collector to sync from iCampus now. Returns immediately; a sync takes about a minute. Limited to once every few minutes. Check sync_status afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotentHint=true, destructiveHint=false), the description adds key behavior: the call returns immediately while the sync takes about a minute, and it is rate-limited to once every few minutes. This meaningfully informs the agent about async behavior and throttling.
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 three short sentences, each earning its place: the action, the async behavior, and the follow-up guidance. It is front-loaded and contains no filler.
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?
With no parametersainer un output schema, the description provides all necessary operational context: what happens, when it returns, the rate limit, and how to verify completion via sync_status. Nothing critical is missing.
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 already covers everything, so there is nothing for the description to add. The description does not need to explain parameters, and the baseline for a parameterless tool is met.
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 clearly states the action ('Ask the collector to sync from iCampus now'), identifies the target resource (iCampus), and distinguishes the operation from status-checking by pointing to sync_status. This is a specific verb+resource statement with no ambiguity.
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 gives clear when-to-use context by describing the sync trigger and its asynchronous nature. It also tells the agent to check sync_status afterwards, which provides an explicit follow-up alternative. It does not state when not to use it, but the guidance is enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_statusARead-only
When the data was last refreshed (per dataset), whether the last runs worked, and any login problem. Call this first if answers look stale or empty.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows this is a safe read operation. The description adds valuable context about what the tool reports (last refresh time, run success, login problems) and that it is a diagnostic call. It does not contradict annotations and provides sufficient behavioral detail for a parameterless read-only tool.
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 two sentences with no filler. The first sentence states what the tool reports, and the second gives a precise usage trigger. It is front-loaded with the core purpose and immediately actionable guidance, making it highly efficient.
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 parameterless read-only status tool, the description is complete. It tells the agent what information will be returned (data freshness, run success, login issues) and when to call it. There is no output schema, but the description adequately covers the expected content. No other context is needed for correct invocation.
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 there is nothing for the description to explain. The baseline for zero parameters is 4, and the description does not need to add parameter semantics. It correctly omits any parameter details, which would be irrelevant.
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 explicitly states the tool's function: reporting when data was last refreshed per dataset, whether runs succeeded, and any login problems. This clearly distinguishes it from sibling tools that list or retrieve data, and from the refresh tool which likely triggers a refresh. The verb 'call' and the specific information items make the purpose unambiguous.
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 provides explicit usage guidance: 'Call this first if answers look stale or empty.' This tells the agent exactly when to invoke this tool versus alternatives, and implies it is a diagnostic step before trusting data. It also implicitly distinguishes it from refresh, which would be the action to take if sync is outdated.
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.
8 tool updates
v0.1.0- First observed
get_grades - First observed
list_announcements - First observed
list_courses - First observed
list_lectures - First observed
list_tasks - First observed
read_announcement - First observed
refresh - First observed
sync_status
TDQS
Scored across 8 tools
Most tools clearly target distinct resources: announcements, courses, tasks, lectures, grades, and sync status. The only mild overlap is list_tasks including lecture completion while list_lectures also reports completion, but their primary purposes are still distinguishable. refresh and sync_status are complementary rather than competing.
The dominant list_* prefix creates a mostly readable pattern, and read_announcement and get_grades fit loosely within it. However, refresh and sync_status break the verb_noun style, and pluralization is inconsistent with list_announcements vs. read_announcement. The naming is understandable but not fully predictable.
Eight tools is well within the ideal range for a campus portal integration. Each tool covers a distinct area—announcements, courses, tasks, lectures, grades, and sync—without redundancy or bloat.
The read-only scope is well covered: announcements have list/detail, the major coursework views have dedicated list endpoints, grades are exposed, and sync status is handled. Minor gaps exist such as no per-course detail or task/lecture detail endpoints, but common workflows around due work, lectures, and grades are fully supported.
Maintenance
Related MCP Connectors
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Read-only MCP server for Muovi, Argentina's trust-first local services marketplace (6 tools).
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to access Canvas LMS academic data such as courses, assignments, grades, and events via MCP tools.-
- FlicenseNot gradedqualityBmaintenanceMCP server enabling AI assistants to query Myongji College data, including real-time library seat availability, campus notices, department lists, and course search (with user login). All tools are read-only and can be composed to answer complex campus-related questions.-
- FlicenseBqualityBmaintenanceEnables local, read-only access to IE Blackboard, IE Connects, and IE Careers within AI assistants, with 49 tools for deadlines, readings, events, grades, internships, and more.49-
- AlicenseAqualityAmaintenanceEnables AI assistants to query SeoulTech e-Class course announcements and assignments, search full notice text, track pending work, and refresh login sessions securely through natural language.7MIT