skyward-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@skyward-mcpshow me my current grades in each class"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
skyward-mcp
Unofficial self hosted Skyward MCP for students and educators.
Connect ChatGPT, Claude, or another MCP client to the Skyward account that the person running the server is already authorized to use.
What this is
skyward-mcp is the MCP application layer built on top of skyward-rest.
The split is intentional:
skyward-rest
typed Skyward client
authenticated transport
provider adapters
safe parsers
skyward-mcp
MCP tools
local setup
ChatGPT OAuth
browser SSO
role aware privacy
future write approvalsThe project is designed around user hosted access. It does not require a centrally registered Skyward OAuth application.
Related MCP server: unofficial-magister-mcp
Current status
The first release is deliberately read only.
Current tools:
Tool | Purpose |
| Validate the current Skyward session and show redacted health, role, and provider status |
| Show exactly what the active provider supports |
| Read report card grade data |
| Read a detailed course gradebook |
| Read academic history |
| Read attendance details and history |
| Read current schedule and course request tables |
| Read test score tables |
| Read fee and balance tables |
| Read graduation requirement tables |
The current skyward-rest SMS 2.0 provider implements the student read surfaces that have actually been rebuilt and tested from modern route discovery.
Teacher, parent, staff, Qmlativ, broader profile data, calendar event parsing, and SIS write support remain extension points rather than fake claims of support.
Authentication model
There are two separate authentication layers.
ChatGPT / Claude
|
| MCP authorization
v
skyward-mcp
|
| authenticated Skyward session
v
SkywardMCP authentication
Hosted mode uses MCP_AUTH_TOKEN.
ChatGPT can connect using the built in OAuth 2.1 compatibility flow with PKCE. The authorization page asks for the same MCP_AUTH_TOKEN configured on the deployment.
Other MCP clients may use that secret directly as a Bearer token.
Skyward authentication
skyward-mcp supports browser SSO capture, local session files, hosted session secrets, and compatible classic SMS 2.0 native login.
The password path is only for Skyward deployments that still allow that login flow.
If the district requires SSO, skyward-mcp does not ask for Microsoft, Google, ClassLink, Clever, or other identity provider passwords.
Browser SSO is implemented locally with the intended architecture:
real district browser login
|
| user completes SSO and MFA normally
v
authenticated Skyward browser session
|
| imported into the self hosted instance
v
SkywardSession
|
v
skyward-restRun npm run setup:sso. A temporary local Chrome, Edge, or Chromium profile opens to the real district login. Complete SSO and MFA normally. skyward-mcp ignores off origin identity provider traffic and waits until Skyward itself emits the resulting SMS session fields, then saves only the Skyward session locally.
Local setup
Requirements:
Node.js 20 or newer
npm
git clone https://github.com/caleb-mau/skyward-mcp.git
cd skyward-mcp
npm install
npm run setupThe setup command opens a page on 127.0.0.1.
For a compatible classic SMS 2.0 login, enter the Skyward login URL, username, and password. The local process authenticates directly with that Skyward instance and saves only the resulting session.
The password is not persisted.
Browser SSO
For districts that use Microsoft, Google, ClassLink, Clever, SAML, or another browser based login:
npm run setup:ssoYou can also provide the starting Skyward URL:
npm run setup -- --sso "https://skyward.example.net/"The command opens an installed Chrome, Edge, or Chromium browser in a temporary profile. Complete the district login and MFA normally.
skyward-mcp only inspects requests whose origin matches the Skyward origin and only extracts the resulting Skyward session fields needed by skyward-rest. It does not store the identity provider password, SAML assertion, Microsoft token, Google token, or other off origin authentication traffic.
Once the complete Skyward session is observed, the browser closes and the session is saved locally.
The default session path is:
~/.skyward-mcp/session.jsonThe file is written with restrictive permissions.
Import an existing session
If another local browser flow produces a SkywardSessionExport:
npm run setup -- --import-session ./skyward-session.jsonThe session is validated through skyward-rest before it is saved.
Run locally over stdio
npm run start:stdioExample MCP configuration:
{
"mcpServers": {
"skyward": {
"command": "npm",
"args": ["run", "start:stdio", "--silent"],
"cwd": "/absolute/path/to/skyward-mcp"
}
}
}Deploy to Vercel
Vercel is the easiest hosted path.
First authenticate locally once. For a district using SSO:
git clone https://github.com/caleb-mau/skyward-mcp.git
cd skyward-mcp
npm install
npm run setup:ssoFor a compatible native Skyward login, npm run setup is still available.
Then generate the two values Vercel needs:
npm run vercel:envThe command prints:
MCP_AUTH_TOKEN=...
SKYWARD_SESSION_B64=...Treat both values as secrets. SKYWARD_SESSION_B64 is base64 encoding for safe copy and paste, not encryption.
Now use the one click deployment:
Paste those two values when Vercel asks for environment variables. Next.js is detected automatically and no database is required.
Your MCP endpoint will be:
https://your-deployment.vercel.app/mcpThe hosted server also supports these alternatives:
Variable | Required | Purpose |
| hosted | Protects the remote MCP and backs the ChatGPT OAuth flow |
| recommended hosted auth | Base64 encoded |
| Optional canonical deployment origin | |
| alternate hosted auth | Raw |
| server file auth | Path to a session file |
| classic login fallback | SMS 2.0 login URL |
| classic login fallback | Native Skyward username |
| classic login fallback | Native Skyward password |
| Skyward request timeout, default 30000 |
Using a saved session is preferred over storing the Skyward password in Vercel.
A Skyward session can expire. When it does, authenticate locally again, rerun npm run vercel:env, replace SKYWARD_SESSION_B64 in Vercel, and redeploy.
Interactive SSO runs locally rather than inside Vercel. After npm run setup:sso succeeds, run npm run vercel:env and deploy the resulting session exactly the same way as a native Skyward session. Vercel does not need to know whether the original login used Microsoft, Google, ClassLink, Clever, MFA, or native Skyward authentication.
ChatGPT
Add the hosted /mcp URL and use OAuth.
The built in OAuth flow is separate from Skyward authentication. It only proves that the person connecting ChatGPT owns the self hosted MCP deployment.
The OAuth implementation supports:
Authorization code flow
PKCE S256
ChatGPT CIMD client metadata
Short lived access tokens
Refresh tokens
Deployment scoped resources
Discover Skyward routes
Skyward installations vary by district, generation, role, and portal version. The local discovery recorder helps map the authenticated web traffic without exporting the underlying school records.
Run:
npm run discoverOr provide the initial Skyward URL directly:
npm run discover -- --url "https://skyward.example.net/scripts/wsisa.dll/WService=wsEAplus/seplog01.w"The recorder:
Opens installed Google Chrome, Microsoft Edge, or Chromium in a temporary profile
Lets the user complete the district's real login, SSO, and MFA normally
Captures only requests whose origin exactly matches the configured Skyward origin
Ignores Microsoft, Google, ClassLink, Clever, and other off origin authentication traffic
Records paths, HTTP methods, query field names, form field names, selected safe action constants, status codes, content types, table ID patterns, form structure, same origin links, and referenced Skyward endpoints
Writes a machine readable
routes.jsonand a human readableroutes.mdDeletes the temporary browser profile when discovery ends
The export intentionally does not write raw response bodies, response text, cookies, authorization headers, passwords, or raw session token values.
By default, files are written under:
~/.skyward-mcp/discovery/<timestamp>/When you are finished clicking through Skyward, return to the terminal and press Enter.
Useful options:
--url URL
--capture-origin URL
--out PATH
--browser-path PATHThe exact origin restriction is deliberate. If a district starts on one hostname but the actual Skyward portal lives on another, pass the final Skyward portal origin with --capture-origin. Do not set an identity provider as the capture origin.
Even sanitized exports should be reviewed before they are shared or committed. The sanitizer is designed to remove record values while preserving protocol structure, but no automated redaction system should be treated as a guarantee against every district specific field.
Privacy and safety
Skyward is an official student information system. The project treats its data accordingly.
The MCP does not expose:
Skyward passwords
Skyward cookies
SMS session tokens
Raw session exports
Normal status output contains only a redacted session summary and provider capabilities.
The current release contains no SIS write tools.
Read PRIVACY.md and SECURITY.md before using real education records.
Students and educators
The architecture is not student only.
skyward-rest models roles and capabilities for:
Students
Teachers
Parents
Staff
skyward-mcp uses capability discovery rather than assuming every authenticated identity has the same Skyward surface.
Teacher tools will be added when their actual Skyward endpoints and data structures are tested. Future teacher responses should minimize student identity data instead of exposing every field available to the underlying account.
Relationship to Skyward
This is an unofficial open source project and is not affiliated with or endorsed by Skyward, Inc.
Users are responsible for complying with their district policies and only accessing records they are authorized to access.
Development
npm install
npm test
npm run typecheck
npm run buildUse fictional or heavily sanitized test data only.
See CONTRIBUTING.md.
License
MIT. See LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Related MCP Servers
- AlicenseAqualityAmaintenanceConnect Claude and other MCP clients to your Smartschool account to ask about grades, assignments, messages, and your schedule in plain language.1351 PyPI4MIT
- AlicenseAqualityDmaintenanceAn MCP server for accessing Dutch school schedules from Magister. Enables Claude and other MCP-compatible AI assistants to query school schedules, drop-off times, and pick-up times.413 npm4MIT
- AlicenseNot gradedqualityFmaintenanceA local MCP server that enables LLMs like Claude to access Schulmanager Online data including schedules, homework, exams, grades, and parental letters.1-
- FlicenseAqualityCmaintenanceA local MCP server for reading ParentSquare data (feeds, calendar, messages, directory, groups, and more) using undocumented internal APIs. It enables Claude, Cursor, and other MCP clients to access your ParentSquare account via stdio.231-