원클릭으로
school-analytics
Fetch and analyze OpenCode School enrollment and progress data from Cloudflare KV
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Fetch and analyze OpenCode School enrollment and progress data from Cloudflare KV
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | school-analytics |
| description | Fetch and analyze OpenCode School enrollment and progress data from Cloudflare KV |
Use this skill when asked about enrollments, student counts, progress stats, lesson completion rates, exercise completions, demographics, or any analytics about OpenCode School students.
Requires the Cloudflare MCP server (github.com/cloudflare/mcp). The cloudflare-api_execute tool provides a pre-set accountId variable and a cloudflare.request() helper for authenticated API calls.
Student records are stored in Cloudflare KV. To find the namespace ID, read wrangler.jsonc from the project root and find the KV namespace with binding PROGRESS. Use its id value.
Use the Cloudflare API, not the wrangler CLI. wrangler kv key list returns only 25 keys and has no pagination flag.
List keys via GET /accounts/{accountId}/storage/kv/namespaces/{namespaceId}/keys with a limit of 1000. The response includes result_info.cursor for pagination -- keep fetching until the cursor is absent or the result set is empty. Each key object has a name field.
Fetch each value via GET /accounts/{accountId}/storage/kv/namespaces/{namespaceId}/values/{key} (URL-encode the key). The API returns the value as a JSON string, not a parsed object -- always JSON.parse() the result. Fetch in parallel batches of ~20 to stay under rate limits.
Each student record has these fields:
createdAt -- ISO 8601 string, set at enrollment timeupdatedAt -- ISO 8601 string, updated on every writecompletedLessons -- array; items are either bare strings (legacy format) or objects with slug, completedAt, source, and optional model. Normalize by extracting the slug field from objects.completedExercises -- same shape as completedLessonsprofile -- optional object with fields: codingExperience, aiTools, editor, terminalComfort, learningStyle, depthPreference, languages, osdeviceId -- optional UUID string, present only if the client sent one at enrollmentThe cloudflare-api_execute tool truncates responses over ~6000 tokens. Always compute aggregates (counts, buckets, funnels) inside the sandbox function. Never return raw student records.
createdAt against a cutoff timestampcreatedAtprofile.os, profile.editor, profile.codingExperience