get_progress
Retrieve your certification study progress overview, including mastery levels, accuracy, and review status.
Instructions
Get your certification study progress overview including mastery levels, accuracy, and review status.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/tools/get-progress.ts:10-48 (handler)Registers the 'get_progress' MCP tool. It retrieves user progress: loads curriculum, calculates domain-level accuracy and mastered counts, computes overall stats (questions answered + accuracy), and counts overdue reviews. Returns a formatted text summary.
export function registerGetProgress(server: McpServer, db: Database.Database, userConfig: UserConfig): void { server.tool( 'get_progress', 'Get your certification study progress overview including mastery levels, accuracy, and review status.', {}, async () => { const userId = userConfig.userId; ensureUser(db, userId); const curriculum = loadCurriculum(); const mastery = getAllMastery(db, userId); const stats = getTotalStats(db, userId); const overdueReviews = getOverdueReviews(db, userId); const domainProgress = curriculum.domains.map(d => { const domainMastery = mastery.filter(m => m.domainId === d.id); const avgAccuracy = domainMastery.length > 0 ? Math.round(domainMastery.reduce((sum, m) => sum + m.accuracyPercent, 0) / domainMastery.length) : 0; const masteredCount = domainMastery.filter(m => m.masteryLevel === 'mastered').length; return ` D${d.id}: ${d.title} — ${avgAccuracy}% accuracy, ${masteredCount}/${d.taskStatements.length} mastered`; }); const overallAccuracy = stats.total > 0 ? Math.round((stats.correct / stats.total) * 100) : 0; const text = [ '═══ CERTIFICATION STUDY PROGRESS ═══', '', `Questions Answered: ${stats.total}`, `Overall Accuracy: ${overallAccuracy}%`, `Reviews Due: ${overdueReviews.length}`, '', 'Domain Progress:', ...domainProgress, ].join('\n'); return { content: [{ type: 'text' as const, text }] }; } ); } - src/tools/index.ts:5-25 (registration)Registration point: imports and calls registerGetProgress as part of the central registerTools function.
import { registerGetProgress } from './get-progress.js'; import { registerGetCurriculum } from './get-curriculum.js'; import { registerGetSectionDetails } from './get-section-details.js'; import { registerGetPracticeQuestion } from './get-practice-question.js'; import { registerStartAssessment } from './start-assessment.js'; import { registerGetWeakAreas } from './get-weak-areas.js'; import { registerGetStudyPlan } from './get-study-plan.js'; import { registerScaffoldProject } from './scaffold-project.js'; import { registerResetProgress } from './reset-progress.js'; import { registerStartPracticeExam } from './start-practice-exam.js'; import { registerSubmitExamAnswer } from './submit-exam-answer.js'; import { registerGetExamHistory } from './get-exam-history.js'; import { registerFollowUp } from './follow-up.js'; import { registerStartCapstoneBuild } from './start-capstone-build.js'; import { registerCapstoneBuildStep } from './capstone-build-step.js'; import { registerCapstoneBuildStatus } from './capstone-build-status.js'; import { registerDashboard } from './dashboard.js'; export function registerTools(server: McpServer, db: Database.Database, userConfig: UserConfig): void { registerSubmitAnswer(server, db, userConfig); registerGetProgress(server, db, userConfig); - src/db/mastery.ts:8-10 (helper)Queries all domain mastery records for a user, used to compute domain progress.
export function getAllMastery(db: Database.Database, userId: string): readonly DomainMastery[] { return db.prepare('SELECT * FROM domain_mastery WHERE userId = ? ORDER BY domainId, taskStatement').all(userId) as DomainMastery[]; } - src/db/answers.ts:27-30 (helper)Returns total and correct answer counts for a user, used to compute overall accuracy.
export function getTotalStats(db: Database.Database, userId: string): { total: number; correct: number } { const row = db.prepare('SELECT COUNT(*) as total, SUM(CASE WHEN isCorrect THEN 1 ELSE 0 END) as correct FROM answers WHERE userId = ?').get(userId) as { total: number; correct: number }; return { total: row.total, correct: row.correct ?? 0 }; } - src/db/review-schedule.ts:8-10 (helper)Returns overdue review entries for a user, used to show how many reviews are due.
export function getOverdueReviews(db: Database.Database, userId: string): readonly ReviewScheduleEntry[] { return db.prepare('SELECT * FROM review_schedule WHERE userId = ? AND nextReviewAt <= CURRENT_TIMESTAMP ORDER BY nextReviewAt ASC').all(userId) as ReviewScheduleEntry[]; }