Skip to main content
Glama
sammrafferty

BYU Learning Suite MCP Server

by sammrafferty
README.md
# BYU Learning Suite MCP Server

A local MCP server that exposes BYU Learning Suite data (assignments, grades, schedule, announcements, exams, and course content) as tools for Claude Desktop.

Currently uses mock data for a BYU junior Finance student (Spring 2026). The data layer is modular — swap `mockAdapter.js` for a real scraper without changing any MCP logic.

## Setup

```bash
cd byu-learning-suite-mcp
npm install
```

## Run Standalone (for testing)

```bash
npm start
```

The server communicates over stdio, so you won't see output — it's waiting for MCP messages.

## Connect to Claude Desktop

Add the following to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):

```json
{
  "mcpServers": {
    "byu-learning-suite": {
      "command": "node",
      "args": ["/ABSOLUTE/PATH/TO/byu-learning-suite-mcp/src/index.js"]
    }
  }
}
```

Replace the path with your actual absolute path, then restart Claude Desktop.

## Available Tools

| Tool | Description | Params |
|------|-------------|--------|
| `get_assignments` | Upcoming assignments | `course?`, `days_ahead?` (default 14) |
| `get_grades` | Grade summary (or drill into one course) | `course?` |
| `get_schedule` | Weekly class schedule | — |
| `get_announcements` | Recent announcements | `course?`, `limit?` (default 10) |
| `get_exams` | Upcoming exams & testing center windows | `course?` |
| `get_content` | Course content & resources | `course?` |

## Architecture

```
src/
├── index.js              # MCP server entry point
├── tools/
│   └── index.js          # Tool definitions (MCP schema + handlers)
└── data/
    ├── adapter.js        # Adapter interface (dependency injection point)
    ├── mockAdapter.js    # Mock implementation (filters/sorts mock data)
    └── mockData.js       # Raw mock data (courses, assignments, grades, etc.)
```

### Swapping to a Real Backend

1. Create `src/data/scraperAdapter.js` exporting an object with the same interface as `mockDataSource` (each method is async and returns the expected shape).
2. In `src/index.js`, import your scraper and pass it to `createAdapter()`:

```js
import { scraperDataSource } from "./data/scraperAdapter.js";
const data = createAdapter(scraperDataSource);
```

That's it — the tools and MCP server remain unchanged.