@massteck/aloc-mcp-server 1.0.5 → 1.0.7

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
@@ -23,15 +23,33 @@ Official Model Context Protocol (MCP) server for **ALOC** (`@massteck/aloc-mcp-s
23
23
 
24
24
  ---
25
25
 
26
- ## Quickstart
26
+ ## Standard MCP Prompts
27
27
 
28
- ### 1. Installation
28
+ In addition to tools, the server registers standard pedagogical prompt templates:
29
+
30
+ | Prompt | Target Domain | Description |
31
+ | :--- | :---: | :--- |
32
+ | `aloc_socratic_tutor` | Socratic Pedagogy | Guides LLMs to retrieve questions and provide progressive hints without spoiling answers. |
33
+ | `aloc_exam_revision_planner` | Curriculum Planning | Analyzes syllabus topic hierarchies and Bloom difficulty to compile structured study timetables. |
34
+ | `aloc_bloom_evaluator` | Psychometrics | Evaluates cognitive complexity and diagnoses underlying student misconceptions. |
35
+
36
+ ---
37
+
38
+ ## Quickstart & Installation
39
+
40
+ ### Option A: 1-Click Install via Smithery.ai (Claude Desktop)
41
+
42
+ ```bash
43
+ npx -y @smithery/cli install @massteck/aloc-mcp-server --client claude
44
+ ```
45
+
46
+ ### Option B: Manual Installation
29
47
 
30
48
  ```bash
31
49
  npm install -g @massteck/aloc-mcp-server
32
50
  ```
33
51
 
34
- ### 2. Configuration (Claude Desktop)
52
+ ### 1. Configuration (Claude Desktop)
35
53
 
36
54
  Add the following to your `claude_desktop_config.json`:
37
55
 
@@ -50,7 +68,7 @@ Add the following to your `claude_desktop_config.json`:
50
68
  }
51
69
  ```
52
70
 
53
- ### 3. Configuration (Cursor IDE)
71
+ ### 2. Configuration (Cursor IDE)
54
72
 
55
73
  Add the following to your `.cursor/mcp.json`:
56
74
 
@@ -71,13 +89,28 @@ Add the following to your `.cursor/mcp.json`:
71
89
 
72
90
  ---
73
91
 
74
- ## Security & Anti-Scraping
92
+ ## Cursor IDE Integration (`.cursorrules`)
93
+
94
+ Drop a `.cursorrules` file into your project root:
95
+
96
+ ```markdown
97
+ # .cursorrules — ALOC Assessment Infrastructure Assistant
98
+
99
+ You are an expert full-stack EdTech engineer building on ALOC Station (https://aloc.com.ng).
100
+
101
+ ## Best Practices
102
+ 1. Assessment Generation: Use 'aloc_generate_assessment' with official presets ('jamb_standard_40', 'waec_standard_50', 'micro_test_10') instead of raw single-question loops.
103
+ 2. Anti-Cheating: Always pass 'shuffleOptions: true' and unique deterministic seeds ('seed') when creating candidate sitting mock tests.
104
+ 3. Socratic Tutoring: When helping students, use 'aloc_get_question_explanation' to extract misconception hints rather than immediately revealing correct answer keys.
105
+ ```
106
+
107
+ ---
108
+
109
+ ## Authentication & Quota Metering
75
110
 
76
- Every MCP tool call:
77
- 1. Passes an authenticated API key via `X-API-Key`.
78
- 2. Sends client telemetry headers (`X-Client-Type: mcp`, `X-Is-Agent: true`).
79
- 3. Deducts metered credits matching the ALOC pricing tiers.
80
- 4. Enforces request limits (maximum 20 items per search) to prevent bulk harvesting.
111
+ - **API Key Security**: Tool invocations authenticate via your `ALOC_API_KEY` passed in the MCP server environment.
112
+ - **Transparent Metering**: Tool executions consume standard API credits matching ALOC tier rates (Discovery tools are free 0-credit, assessment generation is 1 credit, L3 step-by-step reasoning is 10 credits).
113
+ - **Agent Analytics**: Automatic agent telemetry (`X-Client-Type: mcp`) logs tool usage in your Developer Dashboard for real-time cost and volume tracking.
81
114
 
82
115
  ---
83
116
 
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.5",
3
+ "version": "1.0.7",
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();