Register a plugin in PowerSchool to obtain a client_id and client_secret, then authenticate by POSTing to /oauth/access_token with grant_type=client_credentials to receive a bearer token
Retrieve a page of students with GET /ws/v1/district/student?pagesize=100&page=1, incrementing the page parameter and checking the returned count against pagesize to detect the last page
For each student, read the id field (the PowerSchool internal ID) as well as local_id (the state or district student ID) for cross-system mapping
Retrieve sections with GET /ws/v1/district/section?pagesize=100&page=1 and map section_number and course_number to identify classes
Pull section enrollments with GET /ws/v1/district/section/<sectionid>/section_enrollment to get the list of student IDs enrolled in each section
Known gotchas
Access tokens expire; implement token refresh logic by catching HTTP 401 responses and re-authenticating before retrying the failed request
The PowerSchool REST API requires a plugin manifest installed directly on the PowerSchool server; API access cannot be provisioned purely from an external system without a district administrator installing the plugin
Pagination in PowerSchool REST uses page/pagesize parameters (not offset/limit); requesting page 0 and page 1 may return the same data depending on the version—start from page 1
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