@massteck/aloc-mcp-server 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,9 @@ Official Model Context Protocol (MCP) server for **ALOC** (`@massteck/aloc-mcp-s
13
13
  | `aloc_get_subject_years` | Discovery | **0 credits** | Available examination years for a specific subject & body. |
14
14
  | `aloc_check_credit_balance` | Account | **0 credits** | Check remaining API credit balance & authentication status. |
15
15
  | `aloc_search_questions` | Content | **1–3 credits** | Search curriculum-aligned examination questions with options, topics, and difficulty. |
16
+ | `aloc_generate_assessment` | Assessment | **1 credit** | Assemble psychometrically balanced examination papers based on presets, topics, and seeds. |
17
+ | `aloc_create_assessment_session` | Assessment | **1 credit** | Initialize a timed candidate test session (2-hour lifecycle) for cheat-resistant delivery. |
18
+ | `aloc_get_session_questions` | Assessment | **1 credit** | Retrieve questions allocated to an active candidate assessment session. |
16
19
  | `aloc_get_question_explanation` | Learning | **10 credits** | Retrieve step-by-step solutions, misconceptions, and remedial hints. |
17
20
  | `aloc_get_curriculum_taxonomy` | Curriculum | **Free/3 credits** | Explore the topic taxonomy and syllabus hierarchy. |
18
21
  | `aloc_find_similar_questions` | Intelligence | **10 credits** | Find vector-similar exam questions. |
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ const server = new index_js_1.Server({
12
12
  }, {
13
13
  capabilities: {
14
14
  tools: {},
15
+ prompts: {},
15
16
  },
16
17
  });
17
18
  // Register available tools
@@ -473,6 +474,149 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
473
474
  };
474
475
  }
475
476
  });
477
+ // Register available prompts
478
+ server.setRequestHandler(types_js_1.ListPromptsRequestSchema, async () => {
479
+ return {
480
+ prompts: [
481
+ {
482
+ name: "aloc_socratic_tutor",
483
+ description: "Enacts an adaptive Socratic tutor for African curriculum exams (JAMB, WAEC, NECO). Queries questions via ALOC tools and provides progressive hints without spoiling answers.",
484
+ arguments: [
485
+ {
486
+ name: "subject",
487
+ description: "Curriculum subject (e.g. 'mathematics', 'physics', 'english')",
488
+ required: true,
489
+ },
490
+ {
491
+ name: "examType",
492
+ description: "Target examination body ('jamb', 'waec', 'neco')",
493
+ required: false,
494
+ },
495
+ {
496
+ name: "topic",
497
+ description: "Specific curriculum topic or concept",
498
+ required: false,
499
+ },
500
+ ],
501
+ },
502
+ {
503
+ name: "aloc_exam_revision_planner",
504
+ description: "Analyzes curriculum topic weightings and difficulty scores to compile a structured, multi-week study and mock testing timetable.",
505
+ arguments: [
506
+ {
507
+ name: "subject",
508
+ description: "Target subject (e.g. 'chemistry', 'biology')",
509
+ required: true,
510
+ },
511
+ {
512
+ name: "examType",
513
+ description: "Examination body (e.g. 'jamb', 'waec')",
514
+ required: true,
515
+ },
516
+ {
517
+ name: "weeksAvailable",
518
+ description: "Number of weeks until the examination sitting",
519
+ required: false,
520
+ },
521
+ ],
522
+ },
523
+ {
524
+ name: "aloc_bloom_evaluator",
525
+ description: "Evaluates candidate responses, diagnoses cognitive levels (Bloom's Taxonomy), and maps common distractors to underlying misconceptions.",
526
+ arguments: [
527
+ {
528
+ name: "questionId",
529
+ description: "UUID of the question being analyzed",
530
+ required: true,
531
+ },
532
+ ],
533
+ },
534
+ ],
535
+ };
536
+ });
537
+ // Handle prompt execution
538
+ server.setRequestHandler(types_js_1.GetPromptRequestSchema, async (request) => {
539
+ const { name, arguments: args } = request.params;
540
+ switch (name) {
541
+ case "aloc_socratic_tutor": {
542
+ const subject = args?.subject || "mathematics";
543
+ const examType = args?.examType || "jamb";
544
+ const topic = args?.topic ? ` focusing on '${args.topic}'` : "";
545
+ return {
546
+ description: `Socratic tutoring session for ${examType.toUpperCase()} ${subject}${topic}`,
547
+ messages: [
548
+ {
549
+ role: "user",
550
+ content: {
551
+ type: "text",
552
+ text: `You are an expert, encouraging Socratic tutor specializing in West African examinations (${examType.toUpperCase()} syllabus for ${subject}${topic}).
553
+
554
+ Instructions:
555
+ 1. Use the 'aloc_search_questions' tool to retrieve a verified past examination question for ${subject} (${examType}).
556
+ 2. Present the question and its multiple-choice options (A, B, C, D) clearly to the student without revealing the answer key.
557
+ 3. Invite the student to attempt the question.
558
+ 4. When the student replies:
559
+ - If correct: Praise their mathematical/conceptual reasoning and explain WHY it is correct using 'aloc_get_question_explanation'.
560
+ - If incorrect: Do NOT give away the answer key. Use 'aloc_get_question_explanation' to extract the simplified explanation and common distractor pitfalls. Give a progressive Socratic hint that guides the student to discover their own error.
561
+ 5. Offer follow-up questions from similar topics using 'aloc_find_similar_questions'.`,
562
+ },
563
+ },
564
+ ],
565
+ };
566
+ }
567
+ case "aloc_exam_revision_planner": {
568
+ const subject = args?.subject || "mathematics";
569
+ const examType = args?.examType || "jamb";
570
+ const weeks = args?.weeksAvailable || "4";
571
+ return {
572
+ description: `Study revision planner for ${examType.toUpperCase()} ${subject}`,
573
+ messages: [
574
+ {
575
+ role: "user",
576
+ content: {
577
+ type: "text",
578
+ text: `You are an academic curriculum strategist. Create a comprehensive ${weeks}-week revision plan for a candidate preparing for the ${examType.toUpperCase()} ${subject} examination.
579
+
580
+ Instructions:
581
+ 1. First, call 'aloc_get_curriculum_taxonomy' for subject '${subject}' and exam '${examType}' to retrieve the full official topic breakdown.
582
+ 2. Call 'aloc_get_subject_years' to understand the historical depth.
583
+ 3. Break the revision schedule into weekly modules:
584
+ - Week-by-week topic milestones
585
+ - High-yield topics (most frequently tested)
586
+ - Diagnostic mock test recommendations using 'aloc_generate_assessment' presets (e.g. 'jamb_standard_40' or 'waec_standard_50')
587
+ - Recommended daily practice question volume.`,
588
+ },
589
+ },
590
+ ],
591
+ };
592
+ }
593
+ case "aloc_bloom_evaluator": {
594
+ const questionId = args?.questionId || "";
595
+ return {
596
+ description: `Bloom's Taxonomy evaluation for question ${questionId}`,
597
+ messages: [
598
+ {
599
+ role: "user",
600
+ content: {
601
+ type: "text",
602
+ text: `You are an assessment psychometrician. Analyze question ID '${questionId}' from the ALOC database.
603
+
604
+ Instructions:
605
+ 1. Call 'aloc_get_question_explanation' for questionId '${questionId}' with depth 'step_by_step'.
606
+ 2. Provide a psychometric breakdown:
607
+ - Cognitive domain (Bloom's Taxonomy: Remember, Understand, Apply, Analyze, Evaluate, Create)
608
+ - Calibrated difficulty rating and computational complexity
609
+ - Distractor analysis: Explain what conceptual misunderstanding leads a candidate to choose each wrong option.
610
+ - Recommended remedial teaching strategy for educators.`,
611
+ },
612
+ },
613
+ ],
614
+ };
615
+ }
616
+ default:
617
+ throw new Error(`Unknown ALOC prompt: ${name}`);
618
+ }
619
+ });
476
620
  // Start transport
477
621
  async function main() {
478
622
  const transport = new stdio_js_1.StdioServerTransport();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@massteck/aloc-mcp-server",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Official Model Context Protocol (MCP) Server for ALOC assessment content infrastructure",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -19,10 +19,15 @@
19
19
  "aloc",
20
20
  "mcp",
21
21
  "model-context-protocol",
22
+ "smithery",
22
23
  "ai-agent",
23
24
  "edtech",
24
25
  "curriculum",
25
- "assessment"
26
+ "assessment",
27
+ "jamb",
28
+ "waec",
29
+ "neco",
30
+ "cbt"
26
31
  ],
27
32
  "author": "ALOC Infrastructure Team",
28
33
  "license": "Proprietary",
package/smithery.yaml ADDED
@@ -0,0 +1,23 @@
1
+ # Smithery.ai Model Context Protocol configuration
2
+ # https://smithery.ai/docs/config
3
+
4
+ startCommand:
5
+ type: stdio
6
+ configSchema:
7
+ type: object
8
+ required:
9
+ - apiKey
10
+ properties:
11
+ apiKey:
12
+ type: string
13
+ description: "Your ALOC live or sandbox API key (obtain from https://aloc.com.ng/dashboard/api-keys)"
14
+ baseUrl:
15
+ type: string
16
+ default: "https://dev.aloc.com.ng/api/v1"
17
+ description: "ALOC Station API base URL"
18
+ commandFunction:
19
+ package: "@massteck/aloc-mcp-server"
20
+ args: []
21
+ env:
22
+ ALOC_API_KEY: "{{apiKey}}"
23
+ ALOC_BASE_URL: "{{baseUrl}}"
package/src/index.ts CHANGED
@@ -4,6 +4,8 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
5
  import {
6
6
  CallToolRequestSchema,
7
+ GetPromptRequestSchema,
8
+ ListPromptsRequestSchema,
7
9
  ListToolsRequestSchema,
8
10
  } from "@modelcontextprotocol/sdk/types.js";
9
11
  import { AlocClient } from "./client.js";
@@ -18,6 +20,7 @@ const server = new Server(
18
20
  {
19
21
  capabilities: {
20
22
  tools: {},
23
+ prompts: {},
21
24
  },
22
25
  }
23
26
  );
@@ -517,6 +520,161 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
517
520
  }
518
521
  });
519
522
 
523
+ // Register available prompts
524
+ server.setRequestHandler(ListPromptsRequestSchema, async () => {
525
+ return {
526
+ prompts: [
527
+ {
528
+ name: "aloc_socratic_tutor",
529
+ description:
530
+ "Enacts an adaptive Socratic tutor for African curriculum exams (JAMB, WAEC, NECO). Queries questions via ALOC tools and provides progressive hints without spoiling answers.",
531
+ arguments: [
532
+ {
533
+ name: "subject",
534
+ description: "Curriculum subject (e.g. 'mathematics', 'physics', 'english')",
535
+ required: true,
536
+ },
537
+ {
538
+ name: "examType",
539
+ description: "Target examination body ('jamb', 'waec', 'neco')",
540
+ required: false,
541
+ },
542
+ {
543
+ name: "topic",
544
+ description: "Specific curriculum topic or concept",
545
+ required: false,
546
+ },
547
+ ],
548
+ },
549
+ {
550
+ name: "aloc_exam_revision_planner",
551
+ description:
552
+ "Analyzes curriculum topic weightings and difficulty scores to compile a structured, multi-week study and mock testing timetable.",
553
+ arguments: [
554
+ {
555
+ name: "subject",
556
+ description: "Target subject (e.g. 'chemistry', 'biology')",
557
+ required: true,
558
+ },
559
+ {
560
+ name: "examType",
561
+ description: "Examination body (e.g. 'jamb', 'waec')",
562
+ required: true,
563
+ },
564
+ {
565
+ name: "weeksAvailable",
566
+ description: "Number of weeks until the examination sitting",
567
+ required: false,
568
+ },
569
+ ],
570
+ },
571
+ {
572
+ name: "aloc_bloom_evaluator",
573
+ description:
574
+ "Evaluates candidate responses, diagnoses cognitive levels (Bloom's Taxonomy), and maps common distractors to underlying misconceptions.",
575
+ arguments: [
576
+ {
577
+ name: "questionId",
578
+ description: "UUID of the question being analyzed",
579
+ required: true,
580
+ },
581
+ ],
582
+ },
583
+ ],
584
+ };
585
+ });
586
+
587
+ // Handle prompt execution
588
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
589
+ const { name, arguments: args } = request.params;
590
+
591
+ switch (name) {
592
+ case "aloc_socratic_tutor": {
593
+ const subject = args?.subject || "mathematics";
594
+ const examType = args?.examType || "jamb";
595
+ const topic = args?.topic ? ` focusing on '${args.topic}'` : "";
596
+
597
+ return {
598
+ description: `Socratic tutoring session for ${examType.toUpperCase()} ${subject}${topic}`,
599
+ messages: [
600
+ {
601
+ role: "user",
602
+ content: {
603
+ type: "text",
604
+ text: `You are an expert, encouraging Socratic tutor specializing in West African examinations (${examType.toUpperCase()} syllabus for ${subject}${topic}).
605
+
606
+ Instructions:
607
+ 1. Use the 'aloc_search_questions' tool to retrieve a verified past examination question for ${subject} (${examType}).
608
+ 2. Present the question and its multiple-choice options (A, B, C, D) clearly to the student without revealing the answer key.
609
+ 3. Invite the student to attempt the question.
610
+ 4. When the student replies:
611
+ - If correct: Praise their mathematical/conceptual reasoning and explain WHY it is correct using 'aloc_get_question_explanation'.
612
+ - If incorrect: Do NOT give away the answer key. Use 'aloc_get_question_explanation' to extract the simplified explanation and common distractor pitfalls. Give a progressive Socratic hint that guides the student to discover their own error.
613
+ 5. Offer follow-up questions from similar topics using 'aloc_find_similar_questions'.`,
614
+ },
615
+ },
616
+ ],
617
+ };
618
+ }
619
+
620
+ case "aloc_exam_revision_planner": {
621
+ const subject = args?.subject || "mathematics";
622
+ const examType = args?.examType || "jamb";
623
+ const weeks = args?.weeksAvailable || "4";
624
+
625
+ return {
626
+ description: `Study revision planner for ${examType.toUpperCase()} ${subject}`,
627
+ messages: [
628
+ {
629
+ role: "user",
630
+ content: {
631
+ type: "text",
632
+ text: `You are an academic curriculum strategist. Create a comprehensive ${weeks}-week revision plan for a candidate preparing for the ${examType.toUpperCase()} ${subject} examination.
633
+
634
+ Instructions:
635
+ 1. First, call 'aloc_get_curriculum_taxonomy' for subject '${subject}' and exam '${examType}' to retrieve the full official topic breakdown.
636
+ 2. Call 'aloc_get_subject_years' to understand the historical depth.
637
+ 3. Break the revision schedule into weekly modules:
638
+ - Week-by-week topic milestones
639
+ - High-yield topics (most frequently tested)
640
+ - Diagnostic mock test recommendations using 'aloc_generate_assessment' presets (e.g. 'jamb_standard_40' or 'waec_standard_50')
641
+ - Recommended daily practice question volume.`,
642
+ },
643
+ },
644
+ ],
645
+ };
646
+ }
647
+
648
+ case "aloc_bloom_evaluator": {
649
+ const questionId = args?.questionId || "";
650
+
651
+ return {
652
+ description: `Bloom's Taxonomy evaluation for question ${questionId}`,
653
+ messages: [
654
+ {
655
+ role: "user",
656
+ content: {
657
+ type: "text",
658
+ text: `You are an assessment psychometrician. Analyze question ID '${questionId}' from the ALOC database.
659
+
660
+ Instructions:
661
+ 1. Call 'aloc_get_question_explanation' for questionId '${questionId}' with depth 'step_by_step'.
662
+ 2. Provide a psychometric breakdown:
663
+ - Cognitive domain (Bloom's Taxonomy: Remember, Understand, Apply, Analyze, Evaluate, Create)
664
+ - Calibrated difficulty rating and computational complexity
665
+ - Distractor analysis: Explain what conceptual misunderstanding leads a candidate to choose each wrong option.
666
+ - Recommended remedial teaching strategy for educators.`,
667
+ },
668
+ },
669
+ ],
670
+ };
671
+ }
672
+
673
+ default:
674
+ throw new Error(`Unknown ALOC prompt: ${name}`);
675
+ }
676
+ });
677
+
520
678
  // Start transport
521
679
  async function main() {
522
680
  const transport = new StdioServerTransport();