Skip to main content
Glama

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-mcp

Requires 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

ICTEXAM_BASE_URL

yes

Your site, e.g. https://app.ictlms.net (no trailing /api)

ICTEXAM_EMAIL

yes

A teacher or admin account

ICTEXAM_PASSWORD

yes

Password for that account

ICTEXAM_API_PREFIX

no

/api

API mount path; set empty to hit the backend port directly

ICTEXAM_MCP_ALLOW_WRITE

no

false

Unlock the write tools (see Safety)

ICTEXAM_TIMEOUT_MS

no

60000

Per-request timeout (AI parsing can be slow)

ICTEXAM_TLS_INSECURE

no

false

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

ictexam_list_exams

List exam papers (id, title, status, class, subject)

ictexam_get_exam

One paper's settings, share links and questions

ictexam_list_classes

Classes (course groups)

ictexam_list_subjects

Subjects, each tied to a class

ictexam_gradebook

Per-exam totals and student marks

ictexam_item_analysis

Per-question difficulty, p-value and average mark

Write tools appear only when ICTEXAM_MCP_ALLOW_WRITE=true:

Tool

What it does

ictexam_parse_question_paper

Upload a local PDF/DOCX and AI-extract the questions

ictexam_publish_exam

Publish a paper; returns student and teacher share URLs

ictexam_unpublish_exam

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 tools
ictexam_get_examGet one examA
Read-only

Get a single exam paper by id: its settings, timing, share links and questions.

NameRequiredDescriptionDefault
assessment_idYesThe exam paper (assessment) id.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

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

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 gradebookA
Read-only

Get the teacher gradebook: per-exam totals and student marks. Optionally filter by class_id or subject_id.

NameRequiredDescriptionDefault
class_idNoOptional class id filter.
subject_idNoOptional subject id filter.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 analysisA
Read-only

Per-question item analysis for one exam: difficulty, p-value, average mark and how many responses were full vs zero credit.

NameRequiredDescriptionDefault
assessment_idYesThe exam paper (assessment) id.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 classesA
Read-only

List the classes (course groups) defined on ICTExam.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 examsA
Read-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.

NameRequiredDescriptionDefault
class_idNoOptional class id filter.
subject_idNoOptional subject id filter.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 subjectsA
Read-only

List the subjects on ICTExam, each tied to a class.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 4 tool updatesv0.1.1
    • Changedictexam_get_exam3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / assessment_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / assessment_id / minimum
        Added value: +-9007199254740991
    • Changedictexam_gradebook5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / class_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / class_id / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / subject_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / subject_id / minimum
        Added value: +-9007199254740991
    • Changedictexam_item_analysis3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / assessment_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / assessment_id / minimum
        Added value: +-9007199254740991
    • Changedictexam_list_exams5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / class_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / class_id / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / subject_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / subject_id / minimum
        Added value: +-9007199254740991
  2. 6 tool updatesv0.1.0
    • First observedictexam_get_exam
    • First observedictexam_gradebook
    • First observedictexam_item_analysis
    • First observedictexam_list_classes
    • First observedictexam_list_exams
    • First observedictexam_list_subjects

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

All tools consistently use the ictexam_ prefix followed by snake_case verb/noun names. The pattern is predictable across listing, retrieval, and analysis operations.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers