agentCLAWHUBUnverified

infinitecampus-api

Query an Infinite Campus (Campus Parent portal) district directly with curl instead of running the infinitecampus-mcp server — log in with a real username/password, capture the session cookie + XSRF token, and curl grades, attendance, assignments, schedule, messages, documents, and fees. Use when you want IC data without the MCP, in a script, or on a machine where the MCP isn't installed. Infinite Campus is per-district: the base URL and district app name are configurable, not hardcoded. Skill: infinitecampus-api Owner: chrischall Summary: Query an Infinite Campus (Campus Parent portal) district directly with curl instead of running the infinitecampus-mcp server — log in with a real username/password, capture the session cookie + XSRF token, and curl grades, attendance, assignments, schedule, messages, documents, and fees. Use when you want IC data without the MCP, in a script, or on a machine where

OpenClaw

Rank

62

Safety

84

Downloads

1.7k

Updated

Oct 10, 2026

Version

3.1.9

Source

CLAWHUB

About

What it does, and when to use it.

Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.

Avoid when

  • Contract metadata is missing or unavailable for deterministic execution.

Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing

Public facts

Every fact links back to the source it came from.

Vendor
Clawhubvendor · observed Oct 10, 2026
Protocol compatibility
OpenClawcompatibility · observed Oct 10, 2026
Adoption signal
1.7K downloadsadoption · observed Oct 10, 2026
Latest release
3.1.9release · observed Oct 9, 2026
Handshake status
UNKNOWNsecurity

Install and run

Setup complexity: low.

clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:infinitecampus-api
  1. Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.
  2. Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.

Contract: missing

curl -s "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/snapshot"

Documentation

CLAWHUB

147,712 characters of source documentation, loaded on request.

Extracted files

4 files captured from the source.

SKILL.md

---
name: infinitecampus-api
description: >-
  Query an Infinite Campus (Campus Parent portal) district directly with curl
  instead of running the infinitecampus-mcp server — log in with a real
  username/password, capture the session cookie + XSRF token, and curl grades,
  attendance, assignments, schedule, messages, documents, and fees. Use when
  you want IC data without the MCP, in a script, or on a machine where the MCP
  isn't installed. Infinite Campus is per-district: the base URL and district
  app name are configurable, not hardcoded.
---

# Infinite Campus via curl (no MCP)

Infinite Campus's Campus Parent portal is a classic server-rendered site
(no public API, no bot wall). A plain form POST to `verify.jsp` logs a
parent in and hands back a session cookie — no browser bridge needed. This
is the same login `infinitecampus-mcp`'s `src/client.ts`/`src/auth.ts` do;
this skill reproduces it with `curl` + a cookie jar.

**Infinite Campus is per-district.** Every parent's portal lives at their
own district's host (`https://campus.<district>.k12.example.us` or similar)
under an `appName` path segment. There is no shared IC endpoint — carry the
base URL and district from the same config the MCP uses:

```sh
: "${IC_BASE_URL:?set to your district's portal URL, e.g. https://campus.yourdistrict.org}"
: "${IC_DISTRICT:?set to the appName path segment, e.g. yourdistrict}"
: "${IC_USERNAME:?parent portal username}"
: "${IC_PASSWORD:?parent portal password}"
```

(Same 4 env vars the MCP reads — reuse the repo's `.env` or the host's
secret store; don't hardcode a district.)

## One-time setup

None — `curl` and `jq` are the only tools needed (`brew install jq` if
missing). No profile/pairing step, no extension.

## Login (capture cookies + XSRF token)

`verify.jsp` accepts a urlencoded form POST and returns 200 with an
`<AUTHENTICATION>state</AUTHENTICATION>` marker in the body — **not**
via HTTP status — plus ~20 `Set-Cookie` headers. Use a cookie jar so curl
does the Set-Cookie parsing/deduping for you:

```sh
JAR=$(mktemp)
BODY=$(curl -sS -c "$JAR" \
  "$IC_BASE_URL/campus/verify.jsp?nonBrowser=true" \
  --data-urlencode "username=$IC_USERNAME" \
  --data-urlencode "password=$IC_PASSWORD" \
  --data-urlencode "appName=$IC_DISTRICT" \
  --data-urlencode "portalLoginPage=parents")

echo "$BODY" | grep -o '<AUTHENTICATION>[^<]*' # AUTHENTICATIONsuccess = good
```

`password-error` / `account-locked` / any non-`success` state means the
login failed — check that string before doing anything else. Credentials
go in the form body (never the query string — it lands in access logs).

Pull the XSRF token out of the jar (IC's JS reads it back and echoes it on
every request as `X-XSRF-TOKEN`; `JSESSIONID` alone is not enough):

```sh
XSRF=$(awk -F'\t' '$6=="XSRF-TOKEN"{print $7}' "$JAR")
```

## Core call pattern

Every subsequent request rides the jar + the XSRF header:

```sh
ic_get() { # ic_get <path-with-query>
  curl -sS -b "$JAR" -H "X-XSRF-TOKEN: $XS

_meta.json

{
  "ownerId": "kn700jq4sjtf2anb0rk3ft4p7n856872",
  "slug": "infinitecampus-api",
  "version": "3.1.9",
  "publishedAt": 1791588394808
}

references/endpoints.md

# Infinite Campus endpoints for curl

Assumes the Login block from `../SKILL.md` has already run (`$JAR`, `$XSRF`,
`$IC_BASE_URL` set) and the `ic_get` helper is defined:

```sh
ic_get() { curl -sS -b "$JAR" -H "X-XSRF-TOKEN: $XSRF" -H 'Accept: application/json' "$IC_BASE_URL$1"; }
```

All paths are transcribed from `infinitecampus-mcp`'s `src/tools/*.ts` and
`docs/endpoints.md` — the same requests the `ic_*` MCP tools make. `$PID` =
a student's `personID` from the resolve-first step.

Some IC/prism responses serialize a 1-item collection as a bare object
instead of a 1-element array — pipe through `jq 'if type=="array" then . else [.] end'`
if a recipe below assumes an array and you get an object back.

---

## Students (resolve-first — always start here)

```sh
ic_get '/campus/api/portal/students' \
  | jq '.[] | {personID, firstName, lastName, enrollments}'
```

Each `enrollments[]` entry carries `enrollmentID`, `calendarID`,
`structureID`, `schoolName`, `endDate` — needed by several endpoints below.

## Schedule

```sh
ic_get "/campus/resources/portal/roster?personID=$PID" | jq .
```

(Only `personID` is honored server-side — there is no date/term filter, so
the MCP tool takes none.)

## Assignments

```sh
# all assignments (full term history, ~hundreds of rows)
ic_get "/campus/api/portal/assignment/listView?personID=$PID" | jq .

# scoped to one course (sectionID from the schedule call above)
ic_get "/campus/api/portal/assignment/listView?personID=$PID&sectionID=$SECTION_ID" | jq .

# client-side filters (server ignores date/missing params entirely):
ic_get "/campus/api/portal/assignment/listView?personID=$PID" \
  | jq --arg since 2026-01-01 '[.[] | select(.dueDate >= $since)]'
```

## Recent (recently-graded) assignments

Server-side filtered by `modifiedDate` (defaults to 14 days ago in the MCP;
reproduce with `date -u -v-14d '+%Y-%m-%dT00:00:00'` on macOS):

```sh
SINCE=$(date -u -v-14d '+%Y-%m-%dT00:00:00')
ic_get "/campus/api/portal/assignment/recentlyScored?modifiedDate=$SINCE&personID=$PID" | jq .
```

## Grades

```sh
ic_get "/campus/resources/portal/grades?personID=$PID" | jq .
# scoped to one term:
ic_get "/campus/resources/portal/grades?personID=$PID&termID=$TERM_ID" | jq .
```

## Attendance (per-course summary, loop over each enrollment)

```sh
ic_get "/campus/resources/portal/attendance/$ENROLLMENT_ID?courseSummary=true&personID=$PID" \
  | jq '.terms[]?.courses[]? | {absentList, tardyList, presentList, earlyReleaseList}'
```

Feature-gated: check `displayOptions.attendance` first (see Feature flags,
below) — a 404 here on a district with attendance disabled is expected, not
a bug.

## Attendance events (individual absences/tardies, loop over each enrollment)

```sh
ic_get "/campus/resources/portal/attendance/events?enrollmentID=$ENROLLMENT_ID&personID=$PID" \
  | jq '.events[]? | {date: .localDate, code, description, excuse, comments}'

# excused-only, since a date (client-side filter):
ic_get "/campus/resources/portal/atten

skill-card.md

## Description:

Guides authorized Campus Parent users through district-specific sign-in and read-only queries for grades, attendance, assignments, schedules, messages, documents, and fees using curl.

This skill is ready for commercial/non-commercial use.

## Publisher:

[chrischall](https://clawhub.ai/user/chrischall)

### License/Terms of Use:

MIT-0

## Use Case:

Authorized parents, guardians, and developers use this skill to retrieve student portal information from their own district without installing the MCP server.

### Deployment Geography for Use:

Global

## Known Risks and Mitigations:

Risk: Portal credentials and session tokens can expose a student's account if disclosed.

Mitigation: Use only an account you are authorized to access on a trusted private machine; keep credentials and cookie jars out of logs and shared or synced folders, and delete temporary cookies after use.

Risk: Downloaded documents and query results can contain sensitive student records.

Mitigation: Limit access to authorized users, avoid logging record contents, and remove saved documents when finished.

## Reference(s):

- [Infinite Campus endpoint recipes](references/endpoints.md)
- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/infinitecampus-api)

## Skill Output:

**Output Type(s):** [Shell commands, Configuration guidance, Text]

**Output Format:** [Markdown with curl and jq command examples]

**Output Parameters:** [1D]

**Other Properties Related to Output:** [Responses depend on the district's enabled portal modules; some example endpoints are unconfirmed.]

## Skill Version(s):

3.1.9 (source: ClawHub release evidence)

## Ethical Considerations:

Users should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.
Github ReposUpdated 15h agoRank 70

AionUi

Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!

MCPOPENCLAW
Github ReposUpdated 6mo agoRank 70

activepieces

AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents

OPENCLAW
Github ReposUpdated 6mo agoRank 70

cherry-studio

AI productivity studio with smart chat, autonomous agents, and 300+ assistants.

MCPOPENCLAW
Github ReposUpdated 7mo agoRank 70

CopilotKit

The Frontend for Agents & Generative UI. React + Angular

OPENCLAW

Machine-readable data

The same record, as JSON, for agents and crawlers.

{
  "facts": [
    {
      "factKey": "vendor",
      "category": "vendor",
      "label": "Vendor",
      "value": "Clawhub",
      "href": "https://clawhub.ai/chrischall/skills/infinitecampus-api",
      "sourceUrl": "https://clawhub.ai/chrischall/skills/infinitecampus-api",
      "sourceType": "profile",
      "confidence": "medium",
      "observedAt": "2026-10-10T05:17:49.076Z",
      "isPublic": true
    },
    {
      "factKey": "protocols",
      "category": "compatibility",
      "label": "Protocol compatibility",
      "value": "OpenClaw",
      "href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/contract",
      "sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/contract",
      "sourceType": "contract",
      "confidence": "medium",
      "observedAt": "2026-10-10T05:17:49.076Z",
      "isPublic": true
    },
    {
      "factKey": "traction",
      "category": "adoption",
      "label": "Adoption signal",
      "value": "1.7K downloads",
      "href": "https://clawhub.ai/chrischall/infinitecampus-api",
      "sourceUrl": "https://clawhub.ai/chrischall/infinitecampus-api",
      "sourceType": "profile",
      "confidence": "medium",
      "observedAt": "2026-10-10T05:17:49.076Z",
      "isPublic": true
    },
    {
      "factKey": "latest_release",
      "category": "release",
      "label": "Latest release",
      "value": "3.1.9",
      "href": "https://clawhub.ai/chrischall/infinitecampus-api",
      "sourceUrl": "https://clawhub.ai/chrischall/infinitecampus-api",
      "sourceType": "release",
      "confidence": "medium",
      "observedAt": "2026-10-09T23:26:34.808Z",
      "isPublic": true
    },
    {
      "factKey": "handshake_status",
      "category": "security",
      "label": "Handshake status",
      "value": "UNKNOWN",
      "href": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/trust",
      "sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-chrischall-infinitecampus-api/trust",
      "sourceType": "trust",
      "confidence": "medium",
      "observedAt": null,
      "isPublic": true
    }
  ],
  "events": [
    {
      "eventType": "release",
      "title": "Release 3.1.9",
      "description": "- Removed the sample file skill-card.md. - No functional or documentation changes to the skill itself.",
      "href": "https://clawhub.ai/chrischall/infinitecampus-api",
      "sourceUrl": "https://clawhub.ai/chrischall/infinitecampus-api",
      "sourceType": "release",
      "confidence": "medium",
      "observedAt": "2026-10-09T23:26:34.808Z",
      "isPublic": true
    }
  ]
}

Record generated Oct 10, 2026.

Sponsored

Ads related to infinitecampus-api and adjacent AI workflows.