Create an assessmentItem XML document conforming to the QTI 3.0 namespace (https://purl.imsglobal.org/spec/qti/v3p0/schema/xsd/); declare the identifier, title, adaptive='false', and timeDependent='false' attributes on the root element.
Inside itemBody, add a choiceInteraction element with responseIdentifier, shuffle, and maxChoices='1' attributes; populate simpleChoice children with identifiers and XHTML content.
Declare the RESPONSE outcome variable in responseDeclaration with cardinality='single', baseType='identifier', and list the correct answer in correctResponse.
Author responseProcessing using the standard match-correct template URI (https://purl.imsglobal.org/spec/qti/v3p0/rptemplates/match_correct) or inline responseProcessing logic using responseCondition / match.
Declare SCORE and MAXSCORE outcome variables; for partial credit items add mapping elements in the responseDeclaration to assign per-choice scores.
Package the item and any manifest (imsmanifest.xml or qti-package.xml for QTI 3) into a ZIP archive; validate against the 1EdTech QTI 3 conformance test tool before submitting to an LMS.
Known gotchas
QTI 3.0 uses a different namespace URI from QTI 2.x; many LMS platforms still only support QTI 2.1 — confirm the target platform's certification level before authoring in QTI 3.0.
The shuffle attribute on choiceInteraction randomizes display order but the response is always evaluated against the declared identifier; ensure identifiers are stable across renderings.
Response processing templates are resolved by URI at runtime; if a delivery engine resolves them from a local cache, ensure the cache matches the QTI 3.0 template definitions exactly.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp