Use the Canvas LMS Assignments API to create an external tool assignment with custom launch URL, retrieve submissions, and post a grade via the submissions API
POST /api/v1/courses/{course_id}/assignments with submission_types=['external_tool'], external_tool_tag_attributes.url set to your LTI launch URL, and points_possible
GET /api/v1/courses/{course_id}/assignments/{assignment_id}/submissions?include[]=user to list all submissions with student user objects
Filter submissions by workflow_state to find submitted or graded entries needing processing
PUT /api/v1/courses/{course_id}/assignments/{assignment_id}/submissions/{user_id} with submission[posted_grade] to post a numeric or letter grade
Use the Canvas grade passback endpoint or AGS if the LTI tool posts scores; do not double-post via both REST API and AGS
Poll GET /api/v1/courses/{course_id}/assignments/{assignment_id}/submissions/{user_id}/rubric_assessments to retrieve rubric scores if a rubric was attached
Known gotchas
Canvas rate-limits REST API requests per access token; bulk submission grade updates should use the batch grade update endpoint PUT /api/v1/courses/{id}/assignments/{id}/submissions/update_grades
External tool assignments linked to an LTI 1.3 tool will also receive AGS score posts from the tool; a tool posting via AGS and your code posting via REST API can create a race condition
The posted_grade field accepts a string in points, percentage (e.g., '85%'), or letter grade format; the format must match the assignment's grading_type or Canvas will reject or misinterpret the value
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