# Abaci.One MCP Integration MCP (Model Context Protocol) allows external tools like Claude Code to access student skill data from Abaci.One. ## Quick Start ### 1. Generate an API Key **Via API:** ```bash curl -X POST http://localhost:3000/api/settings/mcp-keys \ -H "Content-Type: application/json" \ -H "Cookie: " \ -d '{"name": "Claude Code"}' ``` **Via UI:** Go to `/settings/mcp-keys` → Enter a name → Click "Generate" ### 2. Configure Claude Code Add to your `.mcp.json` or run `claude mcp add`: ```json { "mcpServers": { "abaci": { "type": "http", "url": "http://localhost:3000/api/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } ``` For production, use your server's URL (e.g., `https://abaci.your-domain.com/api/mcp`). ## Available Tools ### `list_students` List all students accessible to this API key. ```json { "name": "list_students", "arguments": {} } ``` Returns: ```json [ { "playerId": "abc123", "name": "Sonia", "emoji": "🦊" }, { "playerId": "def456", "name": "Fern", "emoji": "🌿" } ] ``` ### `get_student_overview` Quick snapshot of a student's progress. ```json { "name": "get_student_overview", "arguments": { "player_id": "abc123" } } ``` Returns: ```json { "playerId": "abc123", "name": "Sonia", "emoji": "🦊", "lastPracticed": "2026-01-15T10:30:00Z", "totalSkills": 34, "strong": 29, "developing": 5, "weak": 0 } ``` ### `get_skills` Detailed skill mastery data with optional filtering. ```json { "name": "get_skills", "arguments": { "player_id": "abc123", "status": "developing", // optional: "strong", "developing", "weak" "category": "tenComplements" // optional: filter by category } } ``` Returns: ```json [ { "skillId": "tenComplementsSub.-1=+9-10", "displayName": "-1=+9-10", "category": "tenComplementsSub", "attempts": 6, "correct": 4, "errors": 2, "accuracy": 67, "lastPracticed": "2026-01-14T15:00:00Z", "status": "developing" } ] ``` **Skill Categories:** - `basic` - Direct addition/subtraction, heaven bead, simple combinations - `fiveComplements` - Five complements addition (1=5-4, 2=5-3, etc.) - `fiveComplementsSub` - Five complements subtraction - `tenComplements` - Ten complements addition (1=10-9, 2=10-8, etc.) - `tenComplementsSub` - Ten complements subtraction - `advanced` - Cascading carry/borrow ### `get_recent_errors` Get recent incorrect answers for targeted practice. ```json { "name": "get_recent_errors", "arguments": { "player_id": "abc123", "days": 7, // optional, default: 7 "skill_id": "tenComplementsSub.-1=+9-10", // optional "limit": 20 // optional, default: 20 } } ``` Returns: ```json [ { "timestamp": "2026-01-14T15:23:00Z", "skillsExercised": ["tenComplementsSub.-1=+9-10"], "responseTimeMs": 4200 } ] ``` ### `get_practice_sessions` Get practice session history. ```json { "name": "get_practice_sessions", "arguments": { "player_id": "abc123", "days": 14 // optional, default: 14 } } ``` Returns: ```json [ { "date": "2026-01-15T10:30:00Z", "completedAt": "2026-01-15T10:42:00Z", "durationMinutes": 12 } ] ``` ### `get_recommended_focus` Get skills that need the most attention. ```json { "name": "get_recommended_focus", "arguments": { "player_id": "abc123", "count": 5 // optional, default: 5 } } ``` Returns: ```json [ { "skillId": "tenComplementsSub.-1=+9-10", "displayName": "-1=+9-10", "category": "tenComplementsSub", "accuracy": 67, "attempts": 6, "status": "developing", "reason": "needs_practice" } ] ``` **Reason values:** - `needs_practice` - Weak skill, low accuracy - `close_to_mastery` - Developing, almost strong - `maintenance` - Strong but good to review --- ## Session Management Tools These tools allow you to create, control, and monitor practice sessions programmatically. ### `start_practice_session` Create and optionally start a new practice session for a student. ```json { "name": "start_practice_session", "arguments": { "player_id": "abc123", "duration_minutes": 10, "auto_start": true, "enabled_parts": { "abacus": true, "visualization": true, "linear": false }, "max_terms": 5, "game_breaks": { "enabled": true, "max_minutes": 3, "selection_mode": "kid-chooses" } } } ``` **Parameters:** | Parameter | Required | Default | Description | |-----------|----------|---------|-------------| | `player_id` | Yes | - | Student player ID | | `duration_minutes` | Yes | - | Session length (5-60 minutes) | | `auto_start` | No | `false` | If true, immediately approve and start the session | | `enabled_parts.abacus` | No | `true` | Include physical abacus practice | | `enabled_parts.visualization` | No | `true` | Include mental math with visualization | | `enabled_parts.linear` | No | `true` | Include mental math with equations | | `max_terms` | No | `5` | Maximum terms per problem (3-12) | | `game_breaks.enabled` | No | `true` | Allow game breaks between parts | | `game_breaks.max_minutes` | No | `5` | Maximum game break duration | | `game_breaks.selection_mode` | No | `"kid-chooses"` | `"kid-chooses"` or `"auto-start"` | Returns: ```json { "sessionId": "clxyz123", "status": "in_progress", "practiceUrl": "https://abaci.one/practice/abc123", "observeUrl": "https://abaci.one/practice/abc123/observe", "summary": { "totalProblemCount": 45, "estimatedMinutes": 10, "parts": [ { "partNumber": 1, "type": "abacus", "problemCount": 15, "estimatedMinutes": 3 }, { "partNumber": 2, "type": "visualization", "problemCount": 15, "estimatedMinutes": 3 }, { "partNumber": 3, "type": "linear", "problemCount": 15, "estimatedMinutes": 4 } ] } } ``` ### `get_active_session` Get the current active practice session for a student, including URLs and progress. ```json { "name": "get_active_session", "arguments": { "player_id": "abc123" } } ``` Returns (when session exists): ```json { "hasActiveSession": true, "sessionId": "clxyz123", "status": "in_progress", "practiceUrl": "https://abaci.one/practice/abc123", "observeUrl": "https://abaci.one/practice/abc123/observe", "startedAt": 1736956200000, "progress": { "currentPart": 2, "currentProblem": 8, "totalProblems": 45, "completedProblems": 23, "accuracy": 91 } } ``` Returns (when no session): ```json { "hasActiveSession": false, "lastSessionAt": 1736869800000 } ``` ### `control_session` Control an active session: approve, start, end early, or abandon. ```json { "name": "control_session", "arguments": { "player_id": "abc123", "session_id": "clxyz123", "action": "end_early" } } ``` **Actions:** | Action | Description | |--------|-------------| | `approve` | Approve a draft session (makes it ready to start) | | `start` | Start an approved session | | `end_early` | End the session early and save progress | | `abandon` | Abandon the session without saving | Returns: ```json { "success": true, "sessionId": "clxyz123", "newStatus": "completed", "message": "Session ended early" } ``` ### `create_observation_link` Generate a shareable URL that allows anyone (without login) to observe a practice session in real-time. ```json { "name": "create_observation_link", "arguments": { "player_id": "abc123", "session_id": "clxyz123", "expires_in": "24h" } } ``` **Parameters:** | Parameter | Required | Description | |-----------|----------|-------------| | `player_id` | Yes | Student player ID | | `session_id` | Yes | Session plan ID | | `expires_in` | Yes | `"1h"` or `"24h"` | Returns: ```json { "token": "aB3cDeFgH2", "url": "https://abaci.one/observe/aB3cDeFgH2", "expiresAt": 1737042600000 } ``` ### `list_observation_links` List all active (non-expired, non-revoked) observation links for a session. ```json { "name": "list_observation_links", "arguments": { "player_id": "abc123", "session_id": "clxyz123" } } ``` Returns: ```json { "shares": [ { "token": "aB3cDeFgH2", "url": "https://abaci.one/observe/aB3cDeFgH2", "expiresAt": 1737042600000, "viewCount": 3, "createdAt": 1736956200000 } ] } ``` --- ## Worksheet Generation Tools These tools allow you to create and manage math worksheets with configurable difficulty and scaffolding. ### `generate_worksheet` Create a math worksheet with configurable difficulty, scaffolding, and layout. ```json { "name": "generate_worksheet", "arguments": { "operator": "addition", "digit_range": { "min": 2, "max": 3 }, "problems_per_page": 20, "pages": 2, "difficulty_profile": "earlyLearner", "include_answer_key": true, "title": "Morning Practice", "orientation": "landscape", "cols": 5 } } ``` **Parameters:** | Parameter | Required | Default | Description | |-----------|----------|---------|-------------| | `operator` | No | `addition` | `"addition"`, `"subtraction"`, or `"mixed"` | | `digit_range` | No | `{min: 2, max: 2}` | Min/max digits per number (1-5) | | `problems_per_page` | No | `20` | Problems per page (1-40) | | `pages` | No | `1` | Number of pages (1-20) | | `difficulty_profile` | No | `earlyLearner` | Preset difficulty (see `list_difficulty_profiles`) | | `include_answer_key` | No | `false` | Add answer key pages at end | | `title` | No | - | Optional worksheet title | | `orientation` | No | `landscape` | `"portrait"` or `"landscape"` | | `cols` | No | `5` | Number of columns (1-6) | Returns: ```json { "shareId": "aBc123X", "shareUrl": "https://abaci.one/worksheets/shared/aBc123X", "downloadUrl": "https://abaci.one/api/worksheets/download/aBc123X", "summary": { "shareId": "aBc123X", "operator": "addition", "digitRange": { "min": 2, "max": 3 }, "totalProblems": 40, "pages": 2, "problemsPerPage": 20, "cols": 5, "orientation": "landscape", "difficultyProfile": "earlyLearner", "difficultyLabel": "Early Learner", "regroupingPercent": 25, "includeAnswerKey": true, "scaffolding": { "carryBoxes": "whenRegrouping", "answerBoxes": "always", "placeValueColors": "always", "tenFrames": "whenRegrouping" } } } ``` ### `get_worksheet_info` Get information about an existing shared worksheet. ```json { "name": "get_worksheet_info", "arguments": { "share_id": "aBc123X" } } ``` Returns: ```json { "shareId": "aBc123X", "shareUrl": "https://abaci.one/worksheets/shared/aBc123X", "downloadUrl": "https://abaci.one/api/worksheets/download/aBc123X", "title": "Morning Practice", "worksheetType": "addition", "createdAt": "2026-01-15T10:30:00Z", "views": 5, "config": { "operator": "addition", "digitRange": { "min": 2, "max": 3 }, "totalProblems": 40, "pages": 2, "problemsPerPage": 20, "cols": 5, "orientation": "landscape", "difficultyProfile": "earlyLearner", "difficultyLabel": "Early Learner", "regroupingPercent": 25, "includeAnswerKey": true } } ``` ### `list_difficulty_profiles` List all available difficulty profiles with their settings. ```json { "name": "list_difficulty_profiles", "arguments": {} } ``` Returns: ```json { "profiles": [ { "name": "beginner", "label": "Beginner", "description": "Full scaffolding with no regrouping. Focus on learning the structure of addition.", "regrouping": { "pAnyStart": 0, "pAllStart": 0, "percent": 0 }, "scaffolding": { "carryBoxes": "always", "answerBoxes": "always", "placeValueColors": "always", "tenFrames": "always", "borrowNotation": "always", "borrowingHints": "always" } }, { "name": "earlyLearner", "label": "Early Learner", "description": "Scaffolds appear when needed. Introduces occasional regrouping.", "regrouping": { "pAnyStart": 0.25, "pAllStart": 0, "percent": 25 }, "scaffolding": { "carryBoxes": "whenRegrouping", "answerBoxes": "always", "placeValueColors": "always", "tenFrames": "whenRegrouping", "borrowNotation": "whenRegrouping", "borrowingHints": "always" } } ], "progression": [ "beginner", "earlyLearner", "practice", "intermediate", "advanced", "expert" ] } ``` **Difficulty Profile Progression:** 1. `beginner` - Full scaffolding, no regrouping 2. `earlyLearner` - Conditional scaffolding, 25% regrouping 3. `practice` - High scaffolding, 75% regrouping (master WITH support) 4. `intermediate` - Reduced scaffolding, 75% regrouping 5. `advanced` - Minimal scaffolding, 90% regrouping 6. `expert` - No scaffolding, 90% regrouping **Scaffolding Values:** - `always` - Always show this scaffolding element - `never` - Never show this scaffolding element - `whenRegrouping` - Show only when problem requires regrouping - `whenMultipleRegroups` - Show only when problem has multiple regroups - `when3PlusDigits` - Show only when problem has 3+ digits --- ## API Key Management ### List Keys ```bash curl http://localhost:3000/api/settings/mcp-keys \ -H "Cookie: " ``` ### Create Key ```bash curl -X POST http://localhost:3000/api/settings/mcp-keys \ -H "Content-Type: application/json" \ -H "Cookie: " \ -d '{"name": "My Key"}' ``` ### Revoke Key ```bash curl -X DELETE http://localhost:3000/api/settings/mcp-keys/KEY_ID \ -H "Cookie: " ``` ## Security - API keys are scoped to the user who created them - Keys only grant access to players owned by that user (or linked via family code) - Keys can be revoked at any time - `lastUsedAt` is tracked for auditing - Use HTTPS in production ## Protocol Details The MCP endpoint uses JSON-RPC 2.0 over HTTP POST: ```bash curl -X POST http://localhost:3000/api/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "list_students", "arguments": {} } }' ``` Supported methods: - `initialize` - Capability negotiation - `tools/list` - List available tools - `tools/call` - Execute a tool - `resources/list` - List available documentation resources - `resources/read` - Read a specific resource --- ## Resources (Documentation) MCP Resources provide read-only documentation accessible to language models. Use these to understand worksheet configuration options. ### List Resources ```bash curl -X POST http://localhost:3000/api/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "resources/list", "params": {} }' ``` Returns: ```json { "resources": [ { "uri": "docs://worksheet/regrouping", "name": "Regrouping (Carrying/Borrowing)", "description": "What regrouping means pedagogically, and how pAnyStart/pAllStart control problem difficulty", "mimeType": "text/markdown" }, { "uri": "docs://worksheet/scaffolding", "name": "Scaffolding Options", "description": "Visual aids on worksheets: carryBoxes, answerBoxes, placeValueColors, tenFrames, and display rule values", "mimeType": "text/markdown" }, { "uri": "docs://worksheet/difficulty-profiles", "name": "Difficulty Profiles", "description": "The six preset profiles (beginner → expert), when to use each, and progression philosophy", "mimeType": "text/markdown" }, { "uri": "docs://worksheet/digit-range", "name": "Digit Range", "description": "How digitRange.min and digitRange.max affect problem complexity", "mimeType": "text/markdown" }, { "uri": "docs://worksheet/operators", "name": "Operators (Addition/Subtraction/Mixed)", "description": "Difference between operators, pedagogical sequence, and scaffolding differences", "mimeType": "text/markdown" } ] } ``` ### Read Resource ```bash curl -X POST http://localhost:3000/api/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "resources/read", "params": { "uri": "docs://worksheet/scaffolding" } }' ``` Returns: ```json { "contents": [ { "uri": "docs://worksheet/scaffolding", "mimeType": "text/markdown", "text": "# Scaffolding Options\n\nScaffolding elements are visual aids..." } ] } ``` ### Available Resources | URI | Purpose | | -------------------------------------- | ---------------------------------------------------------------------------------------- | | `docs://worksheet/regrouping` | Explains carrying/borrowing and how `pAnyStart`/`pAllStart` control regrouping frequency | | `docs://worksheet/scaffolding` | Describes visual aids: carryBoxes, answerBoxes, placeValueColors, tenFrames | | `docs://worksheet/difficulty-profiles` | The 6 preset profiles and when to use each | | `docs://worksheet/digit-range` | How min/max digits affect problem complexity | | `docs://worksheet/operators` | Addition vs subtraction vs mixed, with scaffolding differences | **Tip:** Read the `difficulty-profiles` resource before generating worksheets to understand how the profiles map to regrouping and scaffolding settings