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.
@@ -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.