18 KiB
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:
curl -X POST http://localhost:3000/api/settings/mcp-keys \
-H "Content-Type: application/json" \
-H "Cookie: <your-session-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:
{
"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.
{
"name": "list_students",
"arguments": {}
}
Returns:
[
{ "playerId": "abc123", "name": "Sonia", "emoji": "🦊" },
{ "playerId": "def456", "name": "Fern", "emoji": "🌿" }
]
get_student_overview
Quick snapshot of a student's progress.
{
"name": "get_student_overview",
"arguments": { "player_id": "abc123" }
}
Returns:
{
"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.
{
"name": "get_skills",
"arguments": {
"player_id": "abc123",
"status": "developing", // optional: "strong", "developing", "weak"
"category": "tenComplements" // optional: filter by category
}
}
Returns:
[
{
"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 combinationsfiveComplements- Five complements addition (1=5-4, 2=5-3, etc.)fiveComplementsSub- Five complements subtractiontenComplements- Ten complements addition (1=10-9, 2=10-8, etc.)tenComplementsSub- Ten complements subtractionadvanced- Cascading carry/borrow
get_recent_errors
Get recent incorrect answers for targeted practice.
{
"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:
[
{
"timestamp": "2026-01-14T15:23:00Z",
"skillsExercised": ["tenComplementsSub.-1=+9-10"],
"responseTimeMs": 4200
}
]
get_practice_sessions
Get practice session history.
{
"name": "get_practice_sessions",
"arguments": {
"player_id": "abc123",
"days": 14 // optional, default: 14
}
}
Returns:
[
{
"date": "2026-01-15T10:30:00Z",
"completedAt": "2026-01-15T10:42:00Z",
"durationMinutes": 12
}
]
get_recommended_focus
Get skills that need the most attention.
{
"name": "get_recommended_focus",
"arguments": {
"player_id": "abc123",
"count": 5 // optional, default: 5
}
}
Returns:
[
{
"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 accuracyclose_to_mastery- Developing, almost strongmaintenance- 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.
{
"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:
{
"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.
{
"name": "get_active_session",
"arguments": {
"player_id": "abc123"
}
}
Returns (when session exists):
{
"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):
{
"hasActiveSession": false,
"lastSessionAt": 1736869800000
}
control_session
Control an active session: approve, start, end early, or abandon.
{
"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:
{
"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.
{
"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:
{
"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.
{
"name": "list_observation_links",
"arguments": {
"player_id": "abc123",
"session_id": "clxyz123"
}
}
Returns:
{
"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.
{
"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:
{
"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.
{
"name": "get_worksheet_info",
"arguments": {
"share_id": "aBc123X"
}
}
Returns:
{
"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.
{
"name": "list_difficulty_profiles",
"arguments": {}
}
Returns:
{
"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:
beginner- Full scaffolding, no regroupingearlyLearner- Conditional scaffolding, 25% regroupingpractice- High scaffolding, 75% regrouping (master WITH support)intermediate- Reduced scaffolding, 75% regroupingadvanced- Minimal scaffolding, 90% regroupingexpert- No scaffolding, 90% regrouping
Scaffolding Values:
always- Always show this scaffolding elementnever- Never show this scaffolding elementwhenRegrouping- Show only when problem requires regroupingwhenMultipleRegroups- Show only when problem has multiple regroupswhen3PlusDigits- Show only when problem has 3+ digits
API Key Management
List Keys
curl http://localhost:3000/api/settings/mcp-keys \
-H "Cookie: <session>"
Create Key
curl -X POST http://localhost:3000/api/settings/mcp-keys \
-H "Content-Type: application/json" \
-H "Cookie: <session>" \
-d '{"name": "My Key"}'
Revoke Key
curl -X DELETE http://localhost:3000/api/settings/mcp-keys/KEY_ID \
-H "Cookie: <session>"
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
lastUsedAtis tracked for auditing- Use HTTPS in production
Protocol Details
The MCP endpoint uses JSON-RPC 2.0 over HTTP POST:
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 negotiationtools/list- List available toolstools/call- Execute a toolresources/list- List available documentation resourcesresources/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
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:
{
"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
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:
{
"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