Skip to main content
Glama

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.

CI License: MIT Node.js 20+ MCP

Deploy with Vercel

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 approvals

The project is designed around user hosted access. It does not require a centrally registered Skyward OAuth application.

Related MCP server: Merlin MCP

Current status

The first release is deliberately read only.

Current tools:

Tool

Purpose

skyward_status

Validate the current Skyward session and show redacted health, role, and provider status

skyward_get_capabilities

Show exactly what the active provider supports

skyward_get_report_card

Read report card grade data

skyward_get_gradebook

Read a detailed course gradebook

skyward_get_academic_history

Read academic history

skyward_get_attendance

Read attendance details and history

skyward_get_schedule

Read current schedule and course request tables

skyward_get_test_scores

Read test score tables

skyward_get_fees

Read fee and balance tables

skyward_get_graduation_requirements

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
      Skyward

MCP 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-rest

Run 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 setup

The 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:sso

You 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.json

The 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.json

The session is validated through skyward-rest before it is saved.

Run locally over stdio

npm run start:stdio

Example 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:sso

For a compatible native Skyward login, npm run setup is still available.

Then generate the two values Vercel needs:

npm run vercel:env

The 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:

Deploy with Vercel

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/mcp

The hosted server also supports these alternatives:

Variable

Required

Purpose

MCP_AUTH_TOKEN

hosted

Protects the remote MCP and backs the ChatGPT OAuth flow

SKYWARD_SESSION_B64

recommended hosted auth

Base64 encoded SkywardSessionExport

MCP_PUBLIC_ORIGIN

Optional canonical deployment origin

SKYWARD_SESSION_JSON

alternate hosted auth

Raw SkywardSessionExport JSON

SKYWARD_SESSION_FILE

server file auth

Path to a session file

SKYWARD_LOGIN_URL

classic login fallback

SMS 2.0 login URL

SKYWARD_USERNAME

classic login fallback

Native Skyward username

SKYWARD_PASSWORD

classic login fallback

Native Skyward password

SKYWARD_TIMEOUT_MS

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 discover

Or 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.json and a human readable routes.md

  • Deletes 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 PATH

The 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 build

Use fictional or heavily sanitized test data only.

See CONTRIBUTING.md.

License

MIT. See LICENSE.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    • Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.

      https://www.quallaa.com/api/mcp
    • 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.

    • Skool MCP server for ChatGPT, Claude and any AI agent: list members, approve membership request, create post, reply to comment, send DM, get members, churn and MRR, create calendar event and add course lesson in your own Skool account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Skool yourself; Cotlet does not store your password and you need no Skool API key. About the official Skool API: Skool has no public API and no developer docs (checked 10 Oct 2026). The only official connection is the Zapier plugin on the Pro plan, which sends new paid members and Membership Questions answers out and can invite a member or unlock a course. Setup and FAQ: https://cotlet.dev/integrations/skool-api-mcp-server

      https://cotlet.dev/mcp/v1/skool
    • Send and read WhatsApp, email and SMS from Claude, ChatGPT, Cursor or any MCP client, from your own accounts: your WhatsApp number (linked by QR code), your mailbox (IMAP/SMTP) and your Android phone (SMS from its SIM). Tools: list-accounts, get-account, add-account, add-email-account, list-messages, send-message (one channel or several in one call). Hosted, OAuth 2.1, nothing to install. Free plan with unlimited messages; paid plans from 19 EUR/month remove the footer and add media and webhooks. Docs and client configs: github.com/UnlimitedMessaging/unlimited-messaging-mcp

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI agents to read a user's SRCE Moodle account data, including grades, deadlines, calendar events, course files, forum posts, and messages, with optional private-message sending gated by phone approval. It can run as a Cloudflare Worker or self-hosted via Node or Docker.
      21 npm
      1
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      A local stdio MCP server exposes 19 tools, one resource, and one prompt so compatible AI assistants can query a student's disciplines, assessments, deadlines, and study materials, then explain questions and save practice exams as local drafts. It reuses the app's local API and SQLite store, keeping credentials and academic data on the student's own computer.
      1
      MIT