Configure LRS credentials (basic auth username/password or OAuth token) and base endpoint URL from your LRS provider
Build a minimal xAPI statement JSON object with actor (IFI such as mbox or account), verb (id and display), and object (activityId and definition)
POST the statement to {lrsEndpoint}/statements with headers Content-Type: application/json and X-Experience-API-Version: 1.0.3
Note the returned statement UUID array for confirmation; store UUIDs for audit purposes
GET {lrsEndpoint}/statements?agent={encodedActorJSON}&activity={activityId}&limit=100 to retrieve matching statements for a specific learner and activity
Use the 'more' URL in the response body to page through additional results when the result set is larger than the requested limit
Known gotchas
The X-Experience-API-Version header is mandatory on every request — its absence causes the LRS to return a 400 error regardless of content correctness
Actor IFIs must be consistent across systems: mixing mbox, account, and openid identifiers for the same learner creates duplicate actor records that do not merge in most LRS implementations
LRS implementations vary in how strictly they validate statement timestamps and duration formats per IEEE 9274.1.1-2023 — test with your specific LRS before bulk import
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