ictexam-mcp
OfficialClick 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., "@ictexam-mcpShow me the item analysis for the last chemistry exam."
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.
ictexam-mcp
A Model Context Protocol server for ICTExam, the AI exam authoring, delivery and auto-grading platform from ICT Innovations.
It lets an AI assistant read your exams, gradebooks and per-question item analysis, and — only when you turn writes on — parse a question paper into a structured exam with AI and publish exams to students.
Install
Run it straight from npm with npx, or install it globally:
npx -y ictexam-mcp # no install
npm install -g ictexam-mcpRequires Node.js 18 or newer.
Related MCP server: Moodle Study MCP
Configure
Set these in your MCP client's server config (or a .env):
Variable | Required | Default | |
| yes | Your site, e.g. | |
| yes | A teacher or admin account | |
| yes | Password for that account | |
| no |
| API mount path; set empty to hit the backend port directly |
| no |
| Unlock the write tools (see Safety) |
| no |
| Per-request timeout (AI parsing can be slow) |
| no |
| Skip TLS verification — self-signed test servers only |
Claude Desktop example
{
"mcpServers": {
"ictexam": {
"command": "npx",
"args": ["-y", "ictexam-mcp"],
"env": {
"ICTEXAM_BASE_URL": "https://app.ictlms.net",
"ICTEXAM_EMAIL": "teacher@example.com",
"ICTEXAM_PASSWORD": "your-password"
}
}
}
}Tools
Read tools are always available:
Tool | What it does |
| List exam papers (id, title, status, class, subject) |
| One paper's settings, share links and questions |
| Classes (course groups) |
| Subjects, each tied to a class |
| Per-exam totals and student marks |
| Per-question difficulty, p-value and average mark |
Write tools appear only when ICTEXAM_MCP_ALLOW_WRITE=true:
Tool | What it does |
| Upload a local PDF/DOCX and AI-extract the questions |
| Publish a paper; returns student and teacher share URLs |
| Set a paper back to draft |
Safety
The server is read-only by default. The three write tools are not registered
at all unless you set ICTEXAM_MCP_ALLOW_WRITE=true, so a default install cannot
change anything on the platform. Parsing a paper spends AI credit on the server,
and publishing makes an exam live for students — both sit behind that switch on
purpose. The client authenticates with the account's own session cookie and
echoes the CSRF token on writes, exactly as the web app does; it never stores or
logs your password beyond the environment you give it.
How it connects
ICTExam runs a FastAPI backend. The server signs in once with your email and
password, keeps the session cookie for the life of the process, and talks to the
REST API under /api (configurable). No API key to provision.
About
Built by Tahir Almas at ICT Innovations — the team behind ICTExam, ICTContact, ICTDialer, ICTFax and ICTPBX. ICTExam ships with a native Moodle activity module (LTI 1.3, grade passback and roster sync); learn more at ictlms.net.
MIT licensed. Issues and PRs welcome at github.com/ictinnovations/ictexam-mcp.
Available Tools
6 toolsictexam_get_examGet one examARead-only
Get a single exam paper by id: its settings, timing, share links and questions.
| Name | Required | Description | Default |
|---|---|---|---|
| assessment_id | Yes | The exam paper (assessment) id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds value by disclosing the payload contents (settings, timing, share links, questions), but says nothing about permissions needed or whether share links are sensitive/expiring.
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 with a colon-separated payload list; every clause carries information and nothing is wasted.
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 with annotations covering safety and no output schema, the description is nearly complete, helpfully previewing the returned fields. It could note id provenance (use list_exams to obtain it) to be 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?
Only one parameter and schema description coverage is 100%, so the schema already documents assessment_id as the exam paper id. The description's 'by id' adds nothing beyond that; baseline 3 applies.
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?
States a specific verb and resource ('Get a single exam paper by id') and enumerates what is returned: settings, timing, share links, questions. The word 'single' implicitly distinguishes it from ictexam_list_exams, though that sibling is never named.
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?
Usage is implied rather than stated: you fetch a single exam when you have an id, and presumably use ictexam_list_exams to discover ids. No explicit when-to-use, when-not-to-use, or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ictexam_gradebookTeacher gradebookARead-only
Get the teacher gradebook: per-exam totals and student marks. Optionally filter by class_id or subject_id.
| Name | Required | Description | Default |
|---|---|---|---|
| class_id | No | Optional class id filter. | |
| subject_id | No | Optional subject id filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description usefully names the returned content (per-exam totals and student marks), but says nothing about result size, pagination, or how a gradebook with many students behaves under openWorld access.
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 sentence with the return content front-loaded and the filter caveat trailing; nothing is wasted. It is arguably too tight, leaving no room for the behavioral detail an agent would want, but sizing itself is good.
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 2-optional-param, read-only tool with no output schema, the description does state what comes back (per-exam totals and student marks) plus the filter options, which is close to sufficient. The remaining gap is the absence of any guidance on default scope when both filters are omitted.
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 both filter parameters are already documented, making 3 the baseline. The description only echoes 'optionally filter by class_id or subject_id' without adding meaning such as how the two filters combine or whether omitting both returns all classes/subjects.
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?
States a specific verb ('Get') and resource ('teacher gradebook') and clarifies the payload with 'per-exam totals and student marks', which is more than a restatement of the name. It does not, however, distinguish itself from siblings like ictexam_get_exam or ictexam_item_analysis, so an agent must infer the boundary.
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?
'Optionally filter by class_id or subject_id' gives a mild usage cue about scoping the result set. There is no explicit when-to-use, when-not-to-use, or named alternative among the five sibling exam/class/subject tools, so the routing decision 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.
ictexam_item_analysisItem analysisARead-only
Per-question item analysis for one exam: difficulty, p-value, average mark and how many responses were full vs zero credit.
| Name | Required | Description | Default |
|---|---|---|---|
| assessment_id | Yes | The exam paper (assessment) id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is clear. The description adds that the result is per-question and lists specific computed metrics, but it does not disclose other behavioral traits like computation cost, caching, or data freshness.
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 efficient sentence with the core purpose and metric list front-loaded. It contains no filler, though the metric enumeration is slightly dense.
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 read-only one-parameter analytics tool with no output schema, the description adequately names the key return values. It could be more complete by clarifying what 'difficulty' and 'p-value' mean or by noting any limitations, but an agent has enough to call 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 coverage is 100%, so the single assessment_id parameter is fully documented in the schema. The description only implies the parameter via 'for one exam' and adds no format or constraint details beyond what the schema provides.
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 a specific analysis resource and scope ('per-question item analysis for one exam') and names the exact metrics produced. It does not explicitly differentiate itself from siblings like ictexam_gradebook, but the purpose is understandable on its own.
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 phrase 'for one exam' implies usage context but does not state when to choose this tool over alternatives such as ictexam_gradebook. No exclusions or prerequisites are mentioned, leaving usage guidance implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ictexam_list_classesList classesARead-only
List the classes (course groups) defined on ICTExam.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint, so the safety and openness profile is covered. The description adds scoping context ('defined on ICTExam') and clarifies the meaning of classes as 'course groups'. It does not contradict the annotations, but it adds little beyond them.
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. It states the verb and resource immediately and adds a parenthetical clarification ('course groups') that improves comprehension without extra length.
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 a clear name and sibling context, this description is sufficient for an agent to select and invoke it correctly. The return behavior is self-evident from the word 'List', and no additional preconditions or configuration details are needed.
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 input schema has zero parameters and 100% schema description coverage, so the schema already carries all the parameter information. The description does not need to explain parameters, and the baseline of 4 applies here.
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 identifies a specific verb ('List') and a clearly scoped resource ('classes (course groups) defined on ICTExam'). It distinguishes this tool from siblings like ictexam_list_subjects and ictexam_list_exams by naming the resource type explicitly. It is not a tautology of the title.
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 intended use: call when you need the list of class/course groups defined on ICTExam. However, it does not explicitly mention when to prefer it over sibling list tools or when not to use it. Usage is clear from context but not explicitly differentiated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ictexam_list_examsList examsARead-only
List exam papers (assessments) on ICTExam: id, title, status (draft/published), class and subject. Start here to find an exam's id. Optionally filter by class_id or subject_id.
| Name | Required | Description | Default |
|---|---|---|---|
| class_id | No | Optional class id filter. | |
| subject_id | No | Optional subject id filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds value by enumerating returned fields, but says nothing about pagination, result limits, or ordering for what is a list endpoint over an open-world source.
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?
Three short sentences, front-loaded with the resource and its returned fields, followed by purpose and filters. No filler whatsoever.
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 two-optional-filter list tool with no output schema, the description helpfully names the returned fields and the entry-point role. The only real gap is the absence of pagination or result-size expectations, which matters for an open-world list endpoint.
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 both parameters are already documented as optional id filters. The description merely restates 'Optionally filter by class_id or subject_id' without adding format, semantics, or interaction details, so the baseline 3 applies.
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?
States a specific verb+resource ('List exam papers (assessments)') and enumerates the returned fields (id, title, status, class, subject). It implicitly distinguishes itself from ictexam_get_exam by framing itself as the entry point for finding an exam's id, though it never names the sibling explicitly.
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?
'Start here to find an exam's id' gives clear contextual guidance on when to reach for this tool, and the optional-filter sentence explains the narrowing behavior. It stops short of stating exclusions or naming the alternative (get_exam) that the returned id feeds into.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ictexam_list_subjectsList subjectsARead-only
List the subjects on ICTExam, each tied to a class.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already tells the agent this is a safe read operation, and the description aligns with that. It adds a small behavioral/data-model detail by noting subjects are tied to classes, but it does not disclose additional behavioral traits such as auth needs or response structure.
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 one short, front-loaded sentence that states exactly what the tool does. Every word earns its place, and there is no redundant 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?
For a zero-parameter, read-only listing tool, the description is nearly complete. It defines the resource and a key relationship to classes, and the annotations cover safety. It does not describe the return shape, but that is a minor gap for such a simple list operation.
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?
There are zero parameters, so the empty schema fully covers parameter semantics. With no parameters, the description does not need to compensate for undocumented inputs, and the tool can be invoked without additional guidance.
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: 'List the subjects on ICTExam.' It also adds a distinguishing detail, 'each tied to a class,' which helps separate this tool from sibling tools like ictexam_list_classes and ictexam_list_exams.
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 no guidance on when to use this tool versus the sibling tools. It does not mention alternatives, exclusions, or a decision rule such as 'use this when you need subjects rather than classes or exams.'
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.
4 tool updates
v0.1.1- Changed
ictexam_get_exam3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / assessment_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / assessment_id / minimumAdded value: +-9007199254740991
- Changed
ictexam_gradebook5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / class_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / class_id / minimumAdded value: +-9007199254740991 - added
Input schema / properties / subject_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / subject_id / minimumAdded value: +-9007199254740991
- Changed
ictexam_item_analysis3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / assessment_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / assessment_id / minimumAdded value: +-9007199254740991
- Changed
ictexam_list_exams5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / class_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / class_id / minimumAdded value: +-9007199254740991 - added
Input schema / properties / subject_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / subject_id / minimumAdded value: +-9007199254740991
6 tool updates
v0.1.0- First observed
ictexam_get_exam - First observed
ictexam_gradebook - First observed
ictexam_item_analysis - First observed
ictexam_list_classes - First observed
ictexam_list_exams - First observed
ictexam_list_subjects
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: listing exams, fetching one exam, retrieving gradebook data, analyzing individual questions, listing classes, and listing subjects. The boundaries between list_exams and get_exam are explicit, and gradebook versus item_analysis target different levels of results.
All tools consistently use the ictexam_ prefix followed by snake_case verb/noun names. The pattern is predictable across listing, retrieval, and analysis operations.
Six tools form a tightly scoped set for exam discovery, inspection, and analytics. There are no redundant or filler tools, and the count is appropriate for the apparent read-focused purpose.
The toolset covers core read operations for exams, classes, subjects, gradebooks, and item analysis, but it lacks any write/lifecycle operations such as creating, updating, publishing, or deleting exams. It also lacks student/roster-level access, which may be needed for some teacher workflows.
Maintenance
Related MCP Connectors
Connect AI assistants to Edusign attendance, courses, learners, documents, and API docs via OAuth.
Gives AI assistants read access to your Dedox help centre and knowledge base articles.
Read-only AI access to HAVN properties, leads, tasks, files, media, and analytics.
Secure AI access to OpenOak tasks, notes, and Kanban boards.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access Canvas LMS course content, including assignments, modules, announcements, and files, to help students manage their coursework.8 npmISC
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to read your Moodle courses, list materials, quizzes, and search content to plan exam preparation through natural language.1-

ictcrm-mcpofficial
AlicenseAqualityAmaintenanceEnables AI assistants to read ICTCRM contact groups and, when write access is enabled, create or delete contacts and add contacts to campaigns.1226 npm1MIT- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to inspect, query, and diagnose an Octopus instance and, when write access is enabled, create releases, deploy releases, run runbooks, and adjust feature toggles.402 npmMIT