infinitecampus-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +11 -0
- package/README.md +38 -0
- package/dist/bundle.js +30665 -0
- package/dist/client.js +183 -0
- package/dist/config.js +47 -0
- package/dist/index.js +42 -0
- package/dist/tools/assignments.js +28 -0
- package/dist/tools/attendance.js +23 -0
- package/dist/tools/behavior.js +32 -0
- package/dist/tools/districts.js +9 -0
- package/dist/tools/documents.js +33 -0
- package/dist/tools/foodservice.js +32 -0
- package/dist/tools/grades.js +20 -0
- package/dist/tools/messages.js +80 -0
- package/dist/tools/schedule.js +22 -0
- package/dist/tools/students.js +15 -0
- package/package.json +49 -0
- package/skills/ic/SKILL.md +156 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ic
|
|
3
|
+
description: This skill should be used when the user asks about Infinite Campus (Campus Parent portal) data for their kids. Triggers on phrases like "check IC", "Infinite Campus", "what's my kid's grade", "any missing assignments", "school messages", "report card", "lunch balance", or any request about a student's schedule, grades, attendance, behavior, food service, documents, or portal messages. Multi-district: a parent of kids in different districts can query and act across all of them from one MCP instance.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# infinitecampus-mcp
|
|
7
|
+
|
|
8
|
+
MCP server for Infinite Campus (Campus Parent portal) — read student schedules, grades, assignments, attendance, behavior, food service, documents, and portal messages across one or more districts.
|
|
9
|
+
|
|
10
|
+
- **Source:** [github.com/chrischall/infinitecampus-mcp](https://github.com/chrischall/infinitecampus-mcp)
|
|
11
|
+
- **npm:** [npmjs.com/package/infinitecampus-mcp](https://www.npmjs.com/package/infinitecampus-mcp)
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
### Option A — Claude Code (direct MCP, no mcporter)
|
|
16
|
+
|
|
17
|
+
Add to `.mcp.json` in your project or `~/.claude/mcp.json`. Districts are numbered (`IC_1_*`, `IC_2_*`, …); the loader scans sequentially until a gap:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"ic": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "infinitecampus-mcp"],
|
|
25
|
+
"env": {
|
|
26
|
+
"IC_1_NAME": "Springfield",
|
|
27
|
+
"IC_1_BASE_URL": "https://campus.springfield.k12.example.us",
|
|
28
|
+
"IC_1_DISTRICT": "springfield",
|
|
29
|
+
"IC_1_USERNAME": "you@example.com",
|
|
30
|
+
"IC_1_PASSWORD": "yourpassword"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
To add more districts, append `IC_2_NAME`, `IC_2_BASE_URL`, `IC_2_DISTRICT`, `IC_2_USERNAME`, `IC_2_PASSWORD`, then `IC_3_*`, etc. The loader stops at the first missing number.
|
|
38
|
+
|
|
39
|
+
### Option B — mcporter
|
|
40
|
+
|
|
41
|
+
#### 1. Install
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm install -g infinitecampus-mcp
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Or from source:
|
|
48
|
+
```bash
|
|
49
|
+
git clone https://github.com/<owner>/infinitecampus-mcp
|
|
50
|
+
cd infinitecampus-mcp
|
|
51
|
+
npm install && npm run build
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### 2. Configure credentials
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
cp .env.example .env
|
|
58
|
+
# Edit .env: set IC_1_NAME, IC_1_BASE_URL, IC_1_DISTRICT, IC_1_USERNAME, IC_1_PASSWORD
|
|
59
|
+
# Add IC_2_*, IC_3_*, ... for additional districts
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### 3. Register with mcporter
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
mcporter config add ic \
|
|
66
|
+
--command "infinitecampus-mcp" \
|
|
67
|
+
--env "IC_1_NAME=Springfield" \
|
|
68
|
+
--env "IC_1_BASE_URL=https://campus.springfield.k12.example.us" \
|
|
69
|
+
--env "IC_1_DISTRICT=springfield" \
|
|
70
|
+
--env "IC_1_USERNAME=you@example.com" \
|
|
71
|
+
--env "IC_1_PASSWORD=yourpassword" \
|
|
72
|
+
--config ~/.mcporter/mcporter.json
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
#### 4. Verify
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
mcporter list --config ~/.mcporter/mcporter.json
|
|
79
|
+
mcporter call ic.ic_list_districts --config ~/.mcporter/mcporter.json
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Calling tools (mcporter)
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
mcporter call ic.<tool_name> [key=value ...] --config ~/.mcporter/mcporter.json
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Always pass `--config ~/.mcporter/mcporter.json` unless a local `config/mcporter.json` exists.
|
|
89
|
+
|
|
90
|
+
Every tool except `ic_list_districts` takes `district` as its first arg (the district name from `ic_list_districts`). Most student-scoped tools also take `studentId` (the personID from `ic_list_students`).
|
|
91
|
+
|
|
92
|
+
## Tools
|
|
93
|
+
|
|
94
|
+
### Districts & Students
|
|
95
|
+
| Tool | Notes |
|
|
96
|
+
|------|-------|
|
|
97
|
+
| `ic_list_districts` | Lists configured districts. Call this first — other tools need the `district` name. |
|
|
98
|
+
| `ic_list_students(district)` | Lists students (kids) attached to the portal account for a district. Use the `personID` for `studentId` on other tools. |
|
|
99
|
+
|
|
100
|
+
### Academics
|
|
101
|
+
| Tool | Notes |
|
|
102
|
+
|------|-------|
|
|
103
|
+
| `ic_get_schedule(district, studentId)` | Today's class schedule by default. |
|
|
104
|
+
| `ic_list_assignments(district, studentId, courseId?, since?, until?, missingOnly?)` | Pass `missingOnly=true` to see only missing/late work across all courses. |
|
|
105
|
+
| `ic_list_grades(district, studentId, termId?)` | Grades summary. Omit `termId` for all terms. |
|
|
106
|
+
|
|
107
|
+
### Daily life
|
|
108
|
+
| Tool | Notes |
|
|
109
|
+
|------|-------|
|
|
110
|
+
| `ic_list_attendance(district, studentId, since?, until?)` | Absences/tardies with dates. |
|
|
111
|
+
| `ic_list_behavior(district, studentId, since?, until?)` | Returns a `FeatureDisabled` warning if the district has no behavior module enabled — this is not an error. |
|
|
112
|
+
| `ic_list_food_service(district, studentId, since?, until?)` | Lunch balance and transactions. Same `FeatureDisabled` fallback as behavior. |
|
|
113
|
+
|
|
114
|
+
### Documents
|
|
115
|
+
| Tool | Notes |
|
|
116
|
+
|------|-------|
|
|
117
|
+
| `ic_list_documents(district, studentId)` | Metadata only (report cards, transcripts, etc.). |
|
|
118
|
+
| `ic_download_document(district, studentId, documentId, destinationPath)` | Writes the PDF to `destinationPath` on disk. **`destinationPath` is required** — confirm the path with the user before calling. |
|
|
119
|
+
|
|
120
|
+
### Messages
|
|
121
|
+
| Tool | Notes |
|
|
122
|
+
|------|-------|
|
|
123
|
+
| `ic_list_messages(district, folder?, page?, size?)` | `folder` is `inbox` or `sent`. Paginated. |
|
|
124
|
+
| `ic_get_message(district, messageId)` | Full message body. |
|
|
125
|
+
| `ic_list_message_recipients(district)` | Valid recipient IDs (teachers, staff) for this district. Call before `ic_send_message` to validate recipients. |
|
|
126
|
+
| `ic_send_message(district, subject, body, recipientIds[])` | **Sends a real message through the portal.** Recipients must come from `ic_list_message_recipients` — made-up IDs will fail. |
|
|
127
|
+
|
|
128
|
+
## Workflows
|
|
129
|
+
|
|
130
|
+
**Discovery (first time):**
|
|
131
|
+
1. `ic_list_districts` → see configured districts
|
|
132
|
+
2. For each district: `ic_list_students(district)` → collect kids and personIDs
|
|
133
|
+
|
|
134
|
+
**Are my kids OK?**
|
|
135
|
+
1. `ic_list_assignments(district, studentId, missingOnly=true)` for each kid
|
|
136
|
+
2. `ic_list_grades(district, studentId)` for a current snapshot
|
|
137
|
+
3. `ic_list_attendance(district, studentId, since=<recent>)` for recent absences
|
|
138
|
+
|
|
139
|
+
**Today's schedule:**
|
|
140
|
+
- `ic_get_schedule(district, studentId)` — returns today's classes by default
|
|
141
|
+
|
|
142
|
+
**Email a teacher:**
|
|
143
|
+
1. `ic_list_message_recipients(district)` → find the teacher's recipient ID
|
|
144
|
+
2. Draft subject/body with the user and confirm
|
|
145
|
+
3. `ic_send_message(district, subject, body, [teacherRecipientId])`
|
|
146
|
+
|
|
147
|
+
**Get the report card:**
|
|
148
|
+
1. `ic_list_documents(district, studentId)` → find the report card's `documentId`
|
|
149
|
+
2. Confirm destination path with the user
|
|
150
|
+
3. `ic_download_document(district, studentId, documentId, destinationPath="/Users/.../report-card.pdf")`
|
|
151
|
+
|
|
152
|
+
## Caution
|
|
153
|
+
|
|
154
|
+
- `ic_send_message` actually sends a portal message to teachers/staff — always confirm subject, body, and recipients with the user before calling.
|
|
155
|
+
- `ic_download_document` writes a PDF to disk at `destinationPath` — confirm the path with the user; overwrites silently.
|
|
156
|
+
- Endpoint behavior varies by district. If `ic_list_behavior` or `ic_list_food_service` returns a `FeatureDisabled` warning, that module is simply turned off for the district — it's not an error.
|