During an LTI 1.3 resource link launch, inspect the https://purl.imsglobal.org/spec/lti-ags/claim/endpoint claim in the id_token JWT; it provides the lineitems URL, the optional lineitem URL (if a single pre-created grade column exists), and the available scopes.
If no lineitem URL is provided and you need to create a grade column, POST a lineitem object (with label, scoreMaximum, and optional resourceId) to the lineitems URL using Content-Type: application/vnd.ims.lis.v2.lineitem+json.
Obtain a scoped Bearer token by making a JWT Bearer client assertion request to the platform's OAuth 2.0 token endpoint, requesting the scope https://purl.imsglobal.org/spec/lti-ags/scope/score; use the token endpoint URL from the platform's OIDC configuration.
POST the score to {lineitem_url}/scores using Content-Type: application/vnd.ims.lis.v1.score+json; the body must include userId (the learner's subject claim from the launch JWT), activityProgress (e.g., Completed), gradingProgress (e.g., FullyGraded), scoreGiven, scoreMaximum, and timestamp.
To read back results, GET {lineitem_url}/results using the scope https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly; results are returned as application/vnd.ims.lis.v2.resultcontainer+json.
Store the lineitem URL alongside the LTI launch session so future score submissions reference the correct grade column without requiring a new launch.
Known gotchas
The scoped Bearer token for AGS is obtained separately from the id_token used for the launch — using the launch token directly on AGS endpoints will return 401; you must exchange a signed client assertion for a service-specific token.
activityProgress and gradingProgress are required fields in the score body; omitting either causes a 400 error even if scoreGiven and scoreMaximum are present.
Some LMS platforms (including Canvas) only expose a lineitem URL in the launch claim when the LTI tool is directly associated with a graded assignment; if you launch from a navigation placement the lineitems container URL is provided but no lineitem URL is set, requiring you to create or look up the correct line item.
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