schoox-mcp-server
OfficialThe Schoox MCP server enables AI assistants to query Schoox LMS data using natural language, without writing API code. Key capabilities include:
User Management: Search and retrieve user profiles, filter by role/job/org unit, look up badges earned, and get manager relationships.
Course Catalog: Browse and filter courses by status/category/language, view details, lectures, exams, enrolled students, coupons, and invitations.
Learning Paths (Curricula): Query structured training programs, list enrollees, and get details on specific learning paths.
Training Analytics & Progress: Get per-user training summaries, course/curriculum/exam completion progress, OJT status, and aggregate analytics.
Events (ILT & Virtual Classroom): List and query in-person and virtual instructor-led training sessions, offerings, attendees, and attendance records.
Exams: Browse the exam catalog and retrieve student scores for specific exams.
Skills & Competencies: List skill definitions, view skills required for jobs, get user skill profiles and assessment results, and explore skill-job-course relationships.
Organizational Structure: Look up org units (stores, locations, departments) and higher-level hierarchy nodes (regions, divisions, areas, districts).
Groups, Jobs & Badges: List user groups, job roles, and available badges configured in the academy.
Content Library: Browse web resources, uploaded files, SCORM packages, and metadata like categories, venues, and timezones.
Academy Usage Stats: Retrieve high-level licensing and usage statistics (total users, active users, license utilization).
Type Definitions: Discover custom type configurations used in org hierarchy and other settings.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@schoox-mcp-serverShow me all active courses in my academy"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@schoox/schoox-mcp-server
MCP server for querying Schoox LMS data via AI assistants.
Connect your AI assistant to your Schoox academy and use natural language to query users, courses, enrollments, progress, events, and more -- without writing API code.
Data Privacy
This server exposes sensitive Schoox data. The API returns user PII (names, emails, employment data) and corporate confidential information (training records, org structure, business data). Any data the MCP tools retrieve flows through your connected AI assistant.
When you use this server with an AI client (Claude Desktop, Claude Code, Cursor, etc.), data returned by the tools is transmitted to your AI provider's servers as part of the conversation. Depending on your account type and your provider's policies, that data may be retained, logged, or used for model training (for example, on free or consumer-tier accounts). Review your AI provider's data usage and retention policies, and prefer accounts or plans with appropriate data protections (such as commercial or enterprise terms that guarantee no training on your data) before connecting this server to production academy data.
Disclaimer: Schoox is not responsible for any data leaks, data exposure, or misuse of data resulting from use of this tool. Responsibility for compliance with your organization's data handling policies and applicable privacy regulations rests with you.
For additional information, please see Schoox's AI Functionality Policy.
Related MCP server: Magento MCP Server
Prerequisites
Node.js 18+ (download)
Schoox API key and Academy ID (available from your Schoox academy admin settings)
Quick Start
Claude Desktop
Add to your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"schoox": {
"command": "/usr/local/bin/npx",
"args": ["-y", "@schoox/schoox-mcp-server"],
"env": {
"SCHOOX_API_KEY": "your-api-key",
"SCHOOX_ACADEMY_ID": "123456"
}
}
}
}Note: Claude Desktop uses a minimal PATH. If you use nvm or Volta, run
which npxto find your full path and replace/usr/local/bin/npxabove.
Claude Code
Add to ~/.claude.json (global, all projects) or .mcp.json in your project root (project-level):
{
"mcpServers": {
"schoox": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@schoox/schoox-mcp-server"],
"env": {
"SCHOOX_API_KEY": "your-api-key",
"SCHOOX_ACADEMY_ID": "123456"
}
}
}
}Or use the CLI:
claude mcp add schoox -e SCHOOX_API_KEY=your-api-key -e SCHOOX_ACADEMY_ID=123456 -- npx -y @schoox/schoox-mcp-serverCursor
Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
{
"mcpServers": {
"schoox": {
"command": "npx",
"args": ["-y", "@schoox/schoox-mcp-server"],
"env": {
"SCHOOX_API_KEY": "your-api-key",
"SCHOOX_ACADEMY_ID": "123456"
}
}
}
}Other MCP Clients
Any MCP-compatible client can use the standard stdio configuration:
{
"mcpServers": {
"schoox": {
"command": "npx",
"args": ["-y", "@schoox/schoox-mcp-server"],
"env": {
"SCHOOX_API_KEY": "your-api-key",
"SCHOOX_ACADEMY_ID": "123456"
}
}
}
}Example
Once configured, ask your AI assistant questions like:
"Show me all active courses in my academy"
"How many users completed the Safety Training course this month?"
"List all events scheduled for next week"
The assistant uses the Schoox MCP tools automatically to fetch data from your academy and respond in natural language.
Available Tools
Tool | Description |
aboves | Look up organizational hierarchy levels above units (regions, divisions, areas, districts) |
badges | List available badges configured in the academy |
content | Browse content items (web resources, uploaded files, SCORM packages) and metadata |
courses | Query the course catalog, course details, skills, students, lectures, and exams |
curriculums | Query learning paths (curricula) -- structured training programs |
dashboard | Training analytics and progress reporting (per-user and aggregate) |
events | Query instructor-led training (ILT) and virtual classroom (VC) events |
exams | Query exam metadata and student exam results/scores |
groups | List user groups configured in the academy |
jobs | List job roles defined in the academy |
skills | Query skill/competency definitions, assessments, and relationships |
types | List custom type definitions configured in academy settings |
units | Look up organizational units (stores, locations, departments) |
usage | Get academy-wide usage and licensing summary statistics |
users | Look up user profiles and badges |
Configuration
All configuration is via environment variables:
Variable | Required | Default | Description |
| Yes | -- | Schoox API key from academy settings |
| Yes | -- | Numeric academy ID from Schoox admin dashboard |
| No | 1000 | Maximum records per paginated request |
| No |
| API base URL |
License
Available Tools
15 toolsabovesARead-only
Look up organizational hierarchy levels above units — regions, divisions, areas, districts, or any custom grouping configured in the academy. Use this for org hierarchy above the unit level. For units themselves (stores, locations, departments), use the units tool instead.
Sub-actions:
list: List all Above Units with optional filtering by type or search term. Supports pagination.
get: Get details of a single Above Unit by ID, including name, type, external ID, and parent information.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' to browse Above Units, 'get' to retrieve a single Above Unit by ID | |
| type_id | No | Filter Above Units by Type ID (e.g. 328339). Use the types tool to discover available type IDs. Used with list action. | |
| search | No | Search by Above Unit title (e.g. 'New York'). Partial match supported. Used with list action. | |
| start | No | Starting position for pagination (e.g. 0). Used with list action. | |
| limit | No | Number of Above Units to return per request. Default: 100, max: 100000. Used with list action. | |
| aboveId | No | Above Unit ID (e.g. 1286994). Required for: get. Set external_id=true if passing an external ID instead of the internal numeric ID. | |
| external_id | No | When true, treats aboveId as an external ID instead of the internal Schoox ID. Default: false. Used with get action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description adds behavioral details such as the return JSON structure (with `_meta` fields), pagination behavior, and the 'truncated' flag. This fully informs the agent of the tool's behavior and responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the core purpose, then presents sub-actions with their associated parameters, and ends with return format. Every sentence serves a purpose without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema, the description fully covers the return format. It explains all needed aspects: purpose, sub-actions, parameter usage, pagination, and return structure. The context is complete for effective tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%—all parameters are described in the schema. The description adds extra context beyond the schema, such as advising to use the 'types' tool for type IDs and explaining the `external_id` parameter. This enhances usability, though the schema itself is already very clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to look up organizational hierarchy levels above units. It uses a specific verb ('Look up') and resource ('above units'), and distinguishes itself from the sibling 'units' tool by explicitly saying to use 'units' for unit-level entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use this for org hierarchy above the unit level. For units themselves... use the units tool instead.' It also lists sub-actions and mentions pagination, leaving no ambiguity about when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
badgesARead-only
List available badges configured in the academy. Use this to see what badges exist and their definitions. To see badges earned by a specific user, use the users tool with the get_badges action instead.
Sub-actions:
list: List all badges of a given type (platform, group, or academy-created badges).
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' to retrieve available badges | |
| badge_type | No | Badge category filter: 'schoox' (platform-default badges), 'group' (group-level badges), or 'academy' (custom academy-created badges). Default: 'schoox'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false. Description adds return structure with truncation handling, which is beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two clear sentences. Second paragraph about sub-actions is slightly redundant but still helpful. Well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations and schema, description covers purpose, usage, return format, and truncation. Could mention pagination params more explicitly, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage 100%, so baseline 3. Description adds value by explaining default badge_type and meaning of enum values, plus context for action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists badges, distinct from sibling users tool that gets badges for a user. Verb 'list' and resource 'badges' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (see available badges) and when-not (use users tool for user-specific badges). Includes sub-actions hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentARead-only
Browse content items (web resources, uploaded files, SCORM packages) and related metadata such as categories, venues, and timezones. Use this for browsing all content types and content metadata. For course-specific data (skills, students, lectures, exams), use the courses tool instead.
Sub-actions:
list: List content items with filtering by type, sub-type, category, tags, or search term. Supports pagination and sorting.
list_categories: List content categories configured in the academy. Useful for discovering category IDs to filter content.
list_venues: List venues (physical locations for events). Supports pagination and search.
list_timezones: List available timezones for scheduling.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' for content items, 'list_categories' for content categories, 'list_venues' for venues, 'list_timezones' for timezones | |
| start | No | Starting position for pagination (e.g. 0). Used with list and list_venues actions. | |
| limit | No | Number of items to return per request. Default: 20, max: 20. Used with list and list_venues actions. | |
| order_by | No | Sort field for content items: 'title', 'time_added', or 'time_modified'. Default: 'time_added'. Used with list action. | |
| direction | No | Sort direction: 'asc' (ascending) or 'desc' (descending). Default: 'desc'. Used with list action. | |
| category_id | No | Filter content items by category ID (e.g. 1703). Use list_categories to discover available IDs. Used with list action. | |
| type_id | No | Content type filter: '1' = Web Resources, '2' = Files. Used with list action. | |
| sub_type_id | No | Content sub-type filter: 1=Online Video, 2=Online Document, 3=Online Article, 4=Online Photo, 5=Academic Link, 6=Website, 7=Document, 8=Video, 9=Image, 10=Audio, 11=SCORM. Used with list action. | |
| tags | No | Filter content items by tags (e.g. 'managers' or 'Tag1,Tag2' for multiple). Used with list action. | |
| search | No | Search content items by name (e.g. 'Safety Training'). Used with list and list_categories actions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive nature. Description adds value by detailing return JSON format, including the truncated flag and meta structure, which helps the agent understand pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is efficiently structured with a clear main purpose, followed by sub-action list and return format. No redundant phrases, but could be slightly more compact by omitting 'Use this for' repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters and 4 sub-actions without output schema, the description covers return format, pagination, filter usage, and truncation handling. It sufficiently explains how to navigate the tool's capabilities.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema provides 100% parameter descriptions. Description adds grouping of parameters per sub-action and explains the purpose of category_id discovery via list_categories. However, the schema already carries most of the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool browses content items and metadata, distinguishes it from the courses tool, and lists specific sub-actions. The verb 'browse' and resource 'content items, categories, venues, timezones' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use ('browsing all content types') and when not ('For course-specific data, use courses instead'), providing a direct alternative. Also explains each sub-action's context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
coursesARead-only
Query the course catalog, course details, and course-related data including skills, students, lectures, exams, coupons, and invitations. Use this for course metadata, catalogs, and course-level data. For a specific user's course progress and completion status, use the dashboard tool with get_user_courses action. For browsing all content types (not just courses), use the content tool.
Sub-actions:
list: Search and filter the course catalog. Paginated.
list_user_courses: List courses for a specific user. Requires userId. Paginated.
list_categories: List course categories configured in the academy.
get: Get full details of a single course. Requires courseId.
get_skills: List skills taught by a course. Requires courseId.
get_students: List students enrolled in a course. Requires courseId. Paginated.
get_lectures: List lectures within a course. Requires courseId.
get_exams: List exams within a course. Requires courseId.
get_coupons: List coupons for a course. Requires courseId.
get_coupon: Get a specific coupon. Requires courseId and couponId.
get_invitations: List invitations for a course. Requires courseId.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' for catalog, 'get' for course details, 'list_user_courses' for a user's courses, etc. | |
| userId | No | User ID. Required for: list_user_courses. Set external_id=true if passing an external ID. | |
| external_id | No | When true, treats userId as an external system ID instead of Schoox internal ID. Default: false. Used with list_user_courses. | |
| role | No | Filter students by role: student, professor, or dropped_out. Used with get_students. | |
| status | No | Course status filter: active or archived. Default: active. Used with list. | |
| search | No | Search courses by name (e.g. 'Safety Training'). Used with list. | |
| category_id | No | Course category ID (e.g. 1703). Use list_categories to discover available IDs. Used with list. | |
| language | No | ISO 639-1 language code to filter courses by content language (e.g. en, es, fr, de, ja, zh). | |
| start | No | Starting position for pagination (e.g. 0). Used with list, list_user_courses, get_students. | |
| enrolled | No | Filter to courses user is enrolled in: true or false. Used with list_user_courses. | |
| limit | No | Max results per page. Used with list, list_user_courses, get_students. | |
| courseId | No | Schoox course ID (e.g. 327827). Required for: get, get_skills, get_students, get_lectures, get_exams, get_coupons, get_coupon, get_invitations. | |
| onlyCompleted | No | When true, returns only users who completed the course. Used with get_students. | |
| couponId | No | Coupon ID. Required for: get_coupon (used with courseId to get a specific coupon). | |
| skills | No | Array of skill/metric IDs to find related courses (e.g. [101, 205]). Used with list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description reinforces this with 'Query' disclosure. It adds behavioral details: pagination notes for list/list_user_courses/get_students, return format with truncated handling, and which parameters are required per sub-action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a concise overview paragraph, bullet list of sub-actions with key requirements, and return format. It is front-loaded with purpose and alternatives. Each sentence adds value; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description explains the return format ({ data, _meta}) and pagination/truncation behavior. It covers all sub-actions and their parameter dependencies. For a complex tool with 15 parameters, this is comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all 15 parameters have descriptions). The description adds contextual semantics by mapping parameters to sub-actions (e.g., 'userId required for list_user_courses', 'external_id used with list_user_courses'), which helps agents apply parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Query' and clearly identifies resources (course catalog, course details, etc.). It explicitly distinguishes from sibling tools 'dashboard' and 'content' by stating alternate use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives ('for course metadata, catalogs, and course-level data') and directs to dashboard/content for other needs. Sub-actions are listed with required parameters, aiding correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
curriculumsARead-only
Query learning paths (curricula) — collections of courses that form a structured training program. Use this for learning path metadata, enrollment, and student lists. For a user's completion progress across learning paths, use the dashboard tool with get_user_curriculums action.
Sub-actions:
list: Search and filter learning paths. Paginated.
list_user_curriculums: List learning paths for a specific user. Requires userId. Paginated.
get: Get full details of a single learning path. Requires curriculumId.
get_students: List students enrolled in a learning path. Requires curriculumId. Paginated.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' for catalog, 'get' for details, 'list_user_curriculums' for a user's paths, 'get_students' for enrollees | |
| start | No | Starting position for pagination (e.g. 0). Used with list, list_user_curriculums, get_students. | |
| limit | No | Max results per page. Used with list, list_user_curriculums, get_students. | |
| status | No | Learning path status: active or archived. Default: active. Used with list. | |
| external_id | No | When true, treats userId as an external system ID instead of Schoox internal ID. Default: false. Used with list_user_curriculums. | |
| userId | No | User ID. Required for: list_user_curriculums. Set external_id=true if passing an external ID. | |
| anyLanguage | No | When true, returns all courses regardless of language. Default: false. Used with list_user_curriculums. | |
| curriculumId | No | Learning path ID (e.g. 5001). Required for: get, get_students. | |
| onlyCompleted | No | When true, returns only users who completed the path. Used with get_students. | |
| completionStartDate | No | ISO date string (e.g. 2024-01-01). Returns users who completed after this date. Used with get_students. | |
| completionEndDate | No | ISO date string (e.g. 2024-12-31). Returns users who completed before this date. Used with get_students. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive. Description adds return format with _meta including truncated flag, plus guidance to apply filters/pagination when truncated. Contradictions: none.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: purpose, usage hint, sub-action list, return format. Front-loaded with key info. Could be slightly more concise but efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a multi-action read-only tool. Covers all sub-actions, return structure, pagination behavior, and distinguishes from sibling. No output schema but description explains return format adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description provides context beyond schema by grouping parameters per sub-action and mentioning pagination. Adds organizational value, but schema already describes each param well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states purpose: query learning paths for metadata, enrollment, student lists. Distinguishes from sibling 'dashboard' with get_user_curriculums for completion progress. Uses specific verbs and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool (learning path metadata, enrollment, student lists) and when not (user's completion progress, use dashboard instead). Also provides sub-actions and their contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboardARead-only
Training analytics and progress reporting. Get per-user training summaries, course/curriculum/exam progress, OJT status, and manager relationships. Also provides aggregate course and curriculum analytics. Use this for training progress, completions, and analytics. For entity metadata and catalogs, use the entity-specific tool instead: users (profile data), courses (course catalog/details), curriculums (learning path metadata), exams (exam catalog/scores).
Sub-actions: User analytics:
list_users: List users with training data. Paginated.
get_user_summary: Training summary for one user. Requires userId.
get_user_manager: Get a user's manager. Requires userId.
get_user_ojts: List on-the-job training items for a user. Requires userId.
get_user_courses: List courses a user is enrolled in with progress. Requires userId.
get_user_curriculums: List learning paths a user is enrolled in with progress. Requires userId.
get_user_exams: List exams a user has taken with scores. Requires userId. Course analytics:
list_courses: List courses with aggregate analytics. Paginated.
get_course: Get analytics for a specific course. Requires courseId. Paginated.
get_course_user: Get one user's progress in a specific course. Requires courseId and userId. Curriculum analytics:
list_curriculums: List learning paths with aggregate analytics.
get_curriculum: Get analytics for a specific learning path. Requires curriculumId. Paginated.
get_curriculum_user: Get one user's progress in a specific learning path. Requires curriculumId and userId. Exam analytics:
list_exams: List exams with aggregate analytics.
get_exam: Get analytics for a specific exam. Requires examId. Paginated.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform. User analytics: list_users, get_user_summary, get_user_manager, get_user_ojts, get_user_courses, get_user_curriculums, get_user_exams. Course/curriculum/exam analytics: list_courses, get_course, get_course_user, list_curriculums, get_curriculum, get_curriculum_user, list_exams, get_exam. | |
| role | No | Filter by user role (e.g. employee, customer). Used with list_users. | |
| external_id | No | When true, treats userId as an external system ID instead of Schoox internal ID. Default: false. | |
| aboveId | No | Filter by Above Unit ID (e.g. region/division). Used with list_users. | |
| unitId | No | Filter by Unit ID (e.g. store/location). Used with list_users. | |
| jobId | No | Filter by Job ID. Used with list_users. | |
| search | No | Search by name, email, or username. Used with list_users. | |
| start | No | Starting position for pagination (e.g. 0). Used with list_users, list_courses. | |
| limit | No | Max results per page, up to 1000. Default: 100. Used with list_users, list_courses. | |
| sort | No | Sort field for results. Used with list_users, list_courses. | |
| order | No | Sort direction: asc or desc. Used with list_users, list_courses. | |
| userId | No | Schoox user ID (e.g. 12345). Required for: get_user_summary, get_user_manager, get_user_ojts, get_user_courses, get_user_curriculums, get_user_exams, get_course_user, get_curriculum_user. Set external_id=true if passing an external ID. | |
| category_id | No | Academy category ID to filter by. Used with get_user_courses, list_courses. | |
| dropped_out | No | When true, includes courses dropped by the user. Used with get_user_courses. Default: false. | |
| courseId | No | Course ID (e.g. 327827). Required for: get_course, get_course_user. | |
| curriculumId | No | Learning path ID (e.g. 5001). Required for: get_curriculum, get_curriculum_user. | |
| examId | No | Exam ID (e.g. 8001). Required for: get_exam. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool is read-only. The description adds value by explaining the return format (JSON with data and _meta), truncation behavior, and pagination/filtering suggestions. It does not mention rate limits or authentication, but overall provides sufficient behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for main purpose, distinguishing guidance, and sub-action lists. However, it is verbose; some information (e.g., repeating parameters in sub-action descriptions) could be more concise. The front-loading of purpose and usage guidelines is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 17 parameters, no output schema, and many sub-actions, the description is remarkably complete. It covers all sub-actions, their required parameters, pagination, return format, and truncation handling. The description compensates for the lack of output schema by detailing the response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents each parameter. The description adds semantic grouping by listing which parameters are used with which sub-actions (e.g., 'Used with list_users'), providing context beyond the schema. This helps the agent understand parameter applicability without relying solely on the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Training analytics and progress reporting.' It enumerates specific sub-actions and explicitly distinguishes from sibling tools by directing metadata queries to entity-specific tools (users, courses, etc.). The verb 'Get' and resource 'analytics' are specific and distinct from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use the tool ('for training progress, completions, and analytics') and when to use alternatives ('For entity metadata and catalogs, use the entity-specific tool instead'). It lists sub-actions with prerequisites, but could be more explicit about when to use specific sub-actions over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eventsARead-only
Query instructor-led training (ILT) and virtual classroom (VC) events -- sessions, offerings, attendees, and attendance data. Use this for scheduled training events. ILT = in-person sessions; VC = virtual/online sessions. Both types share the same parameter patterns but use separate actions (e.g. list_ilt vs list_vc).
Sub-actions: ILT (in-person):
list_ilt: List ILT events with optional date/status filters. Paginated.
get_ilt: Get details of a single ILT event. Requires eventId.
get_ilt_offers: List session offerings for an ILT event. Requires eventId. Paginated.
get_ilt_addOffers: List additional session offerings for an ILT event. Requires eventId. Paginated.
get_ilt_users: List attendees of an ILT event. Requires eventId. Paginated.
get_ilt_usersAttendanceData: Get attendance records for an ILT event. Requires eventId. Paginated. VC (virtual):
list_vc: List VC events with optional date/status filters. Paginated.
get_vc: Get details of a single VC event. Requires eventId.
get_vc_offers: List session offerings for a VC event. Requires eventId. Paginated.
get_vc_users: List attendees of a VC event. Requires eventId. Paginated.
get_vc_usersAttendanceData: Get attendance records for a VC event. Requires eventId. Paginated.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform. ILT actions: list_ilt, get_ilt, get_ilt_offers, get_ilt_addOffers, get_ilt_users, get_ilt_usersAttendanceData. VC actions: list_vc, get_vc, get_vc_offers, get_vc_users, get_vc_usersAttendanceData. | |
| dateStart | No | Date filter start (e.g. 2024-01-01). Used with list_ilt, list_vc to filter events by date range. | |
| dateEnd | No | Date filter end (e.g. 2024-12-31). Used with list_ilt, list_vc to filter events by date range. | |
| start | No | Starting position for pagination (e.g. 0). Used with list_ilt, list_vc. | |
| limit | No | Max events per page. Default: 20. Used with list_ilt, list_vc. | |
| status | No | Event status: active, archived, or canceled. Default: active. Used with list_ilt, list_vc. | |
| eventId | No | Event ID (e.g. 3001). Required for all get_ilt_* and get_vc_* actions. | |
| onlyCompleted | No | When true, returns only users who completed the event (includes certificate date). Used with get_ilt_users, get_vc_users. | |
| search | No | Search events by name. Used with list_ilt, list_vc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, which the description supports by stating it queries data. The description adds behavioral details: pagination, truncation indicator, and return JSON structure, exceeding annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with bullet points and clear separation of ILT and VC sub-actions. It is longer but front-loaded with overall purpose. Could trim some redundancy, but structure aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters and 11 actions, the description covers all sub-actions, parameter applicability, pagination, truncation, and return format. No output schema exists, but the description compensates with detailed JSON structure explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context beyond schema by explaining parameter usage (e.g., 'Date filter start (e.g. 2024-01-01)') and specifying which actions each parameter applies to. This adds meaningful value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it queries instructor-led training (ILT) and virtual classroom (VC) events, listing specific sub-actions for each type. It clearly distinguishes between ILT and VC, making purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description details when to use each sub-action (e.g., 'Requires eventId' for gets, 'Used with list_ilt/list_vc' for filters) and explains pagination via start/limit parameters. While it doesn't compare to sibling tools, usage context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
examsARead-only
Query exam metadata and student exam results/scores. Use this for exam catalogs and per-exam student scores. For a specific user's exam history across all exams, use the dashboard tool with get_user_exams action.
Sub-actions:
list: List all exams in the academy. Paginated.
get_students: List all students who took a specific exam with their scores. Requires examId. Paginated.
get_student: Get one user's score for a specific exam. Requires examId and userId.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' for exam catalog, 'get_students' for all scores on an exam, 'get_student' for one user's score | |
| start | No | Starting position for pagination (e.g. 0). Used with list, get_students. | |
| limit | No | Max students per page, up to 100. Default: 100. Used with list, get_students. | |
| examId | No | Exam ID (e.g. 8001). Required for: get_students, get_student. | |
| userId | No | User ID or external ID. Required for: get_student (returns one user's score for a specific exam). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive. Description adds return format details (data, _meta with truncation flag) and pagination behavior, providing full transparency beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, structured with bullet list for sub-actions, return format note. No redundant sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, 3-action tool with no output schema, description covers return format, pagination, truncation behavior, and required params per action. Complete given annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters with descriptions (100% coverage). Description adds value by grouping parameters per sub-action and clarifying required contexts, elevating beyond baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it queries exam metadata and scores, distinguishes from sibling dashboard tool for user exam history. Verb 'query' is specific, resource is exams.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (exam catalogs, per-exam scores) and when to use sibling tool (dashboard for user's exam history), and references specific action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
groupsARead-only
List user groups configured in the academy. Groups are used for organizing users and assigning content, courses, and learning paths to specific audiences. Use this to browse user groups and discover group IDs.
Sub-actions:
list: List all academy groups with pagination support.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' to retrieve academy groups | |
| start | No | Starting position for pagination (e.g. 0). Used with list action. | |
| limit | No | Number of groups to return per request. Default: 20, max: 20. Used with list action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds value by detailing sub-actions, pagination support, return format (JSON with data and _meta), and what to do when truncated is true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main purpose, and efficiently covers sub-actions and return format without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool, the description covers all necessary aspects: purpose, pagination, truncation handling, and return structure. It is complete given the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are documented. The description adds examples (e.g., 'e.g. 0' for start) and constraints ('Default: 20, max: 20'), providing additional context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists user groups, with specific verb 'list' and resource 'user groups'. It distinguishes from sibling tools like users or courses by focusing on groups for organizing users and assigning content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says to use this to browse user groups and discover group IDs, and provides guidance on pagination and handling truncated results. However, it does not explicitly mention when not to use or alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jobsARead-only
List job roles defined in the academy (e.g. Store Manager, Cashier, Trainer). Job IDs from this tool can be used as filters in the users and skills tools to find users or skills associated with a specific role.
Sub-actions:
list: List all job roles with optional search by title. Supports pagination.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' to retrieve job roles | |
| search | No | Search by job title (e.g. 'Manager'). Partial match supported. Used with list action. | |
| start | No | Starting position for pagination (e.g. 0). Used with list action. | |
| limit | No | Number of jobs to return per request. Default: 100. Used with list action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only and non-destructive. Description adds details about pagination support and the truncated flag in the response, providing behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with purpose first, then sub-actions and return format. Concise but covers essential details; no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately describes return format with data and _meta, including truncated flag. Covers pagination and search. No output schema, so return description is sufficient. Missing error handling but not critical for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description adds limited additional meaning: clarifies that search supports partial match and that start/limit are for pagination with the list action. Does not significantly enhance schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool lists job roles with examples (Store Manager, Cashier). Distinguishes from sibling tools like users and skills by explaining how job IDs can be used as filters in those tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use to get job roles and IDs for filtering in users/skills tools. Also advises narrowing results when truncated flag is true. Lacks explicit when-not-to-use but sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skillsARead-only
Query skill/competency definitions, skill assessments, and the relationships between skills, jobs, courses, and users. Use this for competency management. To see what skills a course teaches, use the courses tool with get_skills action. To see a user's overall training progress (not just skills), use the dashboard tool.
Sub-actions:
list: List all skills/competencies with optional filtering by type or search term. Paginated.
get_job: List skills required for a specific job. Requires jobId.
get_user: Get a user's skill profile (all skills and levels). Requires userId.
get_user_skillAssessments: Get assessment results for a user on a specific skill. Requires skillId and userId.
get_jobs: List jobs that require a specific skill. Requires skillId. Paginated.
get_courses: List courses that teach a specific skill. Requires skillId. Paginated.
get_assessment: Get details of a single assessment. Requires assessmentId.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' for skill catalog, 'get_job' for job skills, 'get_user' for user skill profile, 'get_user_skillAssessments' for assessment results, 'get_jobs'/'get_courses' for skill relationships, 'get_assessment' for assessment details | |
| typeId | No | Filter skills by metric type ID. Used with list. | |
| search | No | Search skills by name (e.g. 'Leadership'). Used with list. | |
| external_id | No | Skill external ID (string, not a boolean flag like other tools). Used with list to filter by external identifier. | |
| start | No | Starting position for pagination (e.g. 0). Used with list, get_jobs, get_courses. | |
| limit | No | Max results per page, up to 100. Default: 100. Used with list, get_jobs, get_courses. | |
| jobId | No | Job ID (e.g. 201). Required for: get_job. | |
| userId | No | User ID (e.g. 12345). Required for: get_user, get_user_skillAssessments. | |
| skillId | No | Skill ID (e.g. 501). Required for: get_user_skillAssessments, get_jobs, get_courses. | |
| assessmentId | No | Assessment ID. Required for: get_assessment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds details on response format (JSON with _meta), pagination behavior, and the truncated flag, fully disclosing tool behavior beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with overall purpose, sibling disambiguation, and sub-action list. Information is front-loaded and each sentence serves a purpose, though slightly lengthy but justified by complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple sub-actions, 10 parameters, no output schema), the description covers return format, pagination, truncated flag, and required params per action. Lacks examples but is highly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, providing baseline 3. Tool description groups parameters by sub-action and clarifies which are required, adding value by mapping actions to parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool queries skill/competency definitions, assessments, and relationships. It differentiates from siblings by directing to courses/get_skills for course skills and dashboard for user training progress.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (competency management) and when not to (course skills, user progress), with named alternatives. Each sub-action includes required parameters for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typesARead-only
List custom type definitions configured in the academy settings. Returns type enumerations such as Above Unit types, which define the organizational hierarchy levels. Use this to discover available type IDs that can be used as filters in other tools (e.g. type_id parameter in the aboves tool).
Sub-actions:
list: List all configured type definitions in the academy.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' to retrieve type definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds return format details including _meta with truncated flag and advice to apply filters/pagination when truncated, exceeding basic safety disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is informative but slightly verbose with return format details. However, it is well-structured with sub-actions and front-loaded purpose. Only minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description covers purpose, usage, return format, and handling of truncated results. Adequate for a simple list tool with one parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the one parameter 'action' with enum 'list' is fully described in schema. Description adds minimal extra meaning, only mentioning the sub-action list in text. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists custom type definitions and returns type enumerations like Above Unit types. Distinguishes from siblings by mentioning usage as filters for the 'aboves' tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this to discover type IDs for filtering in other tools, with a concrete example (type_id parameter in the aboves tool).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unitsARead-only
Look up organizational units (stores, locations, departments) in the academy hierarchy. Units are the lowest level of the organizational structure. Use this for units themselves. For higher-level groupings (regions, divisions, areas), use the aboves tool instead.
Sub-actions:
list: List all active units with optional filtering by search term, parent Above Unit, or Above Unit ID. Supports pagination.
get: Get details of a single unit by ID, including name, external ID, and organizational placement.
list_archived: List archived (inactive) units. Supports pagination.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' for active units, 'get' for a single unit by ID, 'list_archived' for inactive units | |
| search | No | Search by unit title (e.g. 'Chicago'). Comma-separate multiple terms (e.g. 'Chicago,Boston'). Used with list action. | |
| search_above | No | Filter units by their parent Above Unit title (e.g. 'Northeast Region'). Used with list action. | |
| above_id | No | Filter units by Above Unit ID (e.g. 42). Used with list action. | |
| start | No | Starting position for pagination (e.g. 0). Used with list and list_archived actions. | |
| limit | No | Number of units to return per request. Default: 100, max: 100000. Used with list and list_archived actions. | |
| unitId | No | Unit ID (e.g. '100') or external ID. Required for: get. Set external_id=true if passing an external ID instead of the internal numeric ID. | |
| external_id | No | When true, treats unitId as an external ID instead of the internal Schoox ID. Default: false. Used with get action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and destructiveHint=false, which the description reinforces by stating it's a lookup tool. Beyond annotations, the description discloses response format with JSON containing data and _meta, truncation behavior, and sub-action effects. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a main purpose sentence, sibling distinction, sub-action breakdown, and response format. It is clear and informative, though slightly verbose; every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no output schema, and multiple sub-actions, the description covers all aspects: actions, filtering, pagination, response structure, and truncation handling. It also references the sibling tool for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for each parameter. The description adds practical usage details, such as comma-separated search, external_id flag for get action, and pagination defaults. This adds value beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool looks up organizational units, the lowest level in the hierarchy, and explicitly distinguishes from the sibling tool 'aboves' for higher-level groupings. The verb 'look up' and resource 'units' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts with 'aboves' tool, explaining when to use this tool (for units) and when not (for regions/divisions/areas). It also details sub-actions with their use cases, providing clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
usageARead-only
Get academy-wide usage and licensing summary statistics, including total users, active users, and license utilization. Use this for high-level academy usage stats. For per-user training data and progress details, use the dashboard tool instead.
Sub-actions:
list: Retrieve aggregate usage data for the academy.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' to retrieve academy usage statistics |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, establishing safety. The description adds value by specifying the return JSON structure (including truncated flag) and advising to apply filters or pagination when truncated. This adds behavioral context beyond annotations, though no further caveats about performance or auth are provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two focused paragraphs: first states purpose and usage guidance, second details sub-actions and return format. Every sentence adds value, no filler. Well-structured for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one enum parameter and no output schema, the description provides return structure and truncation behavior. However, it mentions applying 'filters or pagination params' without specifying what those might be, which is slightly vague. Annotations cover safety. Overall fairly complete for complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter 'action' is well-documented in the schema with enum and description. The description restates the sub-action 'list' but does not add new semantic information beyond the schema. Baseline of 3 is appropriate as schema bears the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves academy-wide usage and licensing summary statistics, including specific data points like total users and license utilization. It distinguishes from the sibling 'dashboard' tool by contrasting scope (academy-wide vs per-user). The verb 'Get' and resource 'usage' are specific and well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('for high-level academy usage stats') and when not to ('for per-user training data and progress details, use the dashboard tool instead'), naming a direct alternative. This provides clear decision guidance for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
usersARead-only
Look up Schoox user profiles and badges. Use this for identity data (name, email, role, organizational placement). For training progress, course completions, and analytics, use the dashboard tool instead.
Sub-actions:
list: Search and filter users by role, org unit, job, or search term. Paginated.
get: Get full profile for one user. Requires userId. Accepts Schoox ID, external ID (set external_id=true), or email (set is_email=true).
get_badges: List badges earned by a user. Requires userId.
Returns JSON: { data, _meta: { tool, action, returned, truncated? } }. When truncated is true, apply filters or pagination params to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The sub-action to perform: 'list' for user search, 'get' for one user's profile, 'get_badges' for earned badges | |
| userId | No | User identifier (e.g. 12345). Required for: get, get_badges. Accepts Schoox user ID, external ID (set external_id=true), or email (set is_email=true). | |
| external_id | No | When true, treats userId as an external system ID instead of Schoox internal ID. Default: false. | |
| is_email | No | When true, treats userId as an email address for lookup. Default: false. | |
| role | No | Filter by user role: employee, customer, instructor, or member. Used with list. | |
| past | No | Include past/terminated employees. Only applies when role=employee. Default: false. | |
| search | No | Search by first name, last name, email, or username. Used with list. | |
| aboveId | No | Filter by Above Unit ID (e.g. region/division). Used with list. | |
| unitId | No | Filter by Unit ID (e.g. store/location). Used with list. | |
| jobId | No | Filter by Job ID. Used with list. | |
| start | No | Starting position for pagination (e.g. 0). Used with list. | |
| limit | No | Max users per page, up to 1000. Default: 100. Used with list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and destructiveHint=false, so the tool is safe. The description adds behavioral context beyond annotations by detailing the return format (JSON with _meta) and the truncated flag behavior. It also explains how to handle pagination when results are truncated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with a clear opening sentence, then bullet-style lists for sub-actions and parameter notes. It front-loads the primary purpose and alternative tool, making it easy for an agent to quickly understand usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 12 parameters and no output schema, the description covers return format, pagination, and truncation behavior. Combined with the detailed schema, it provides complete guidance for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters are described. The description adds meaning by grouping parameters by sub-action and explaining the userId acceptance logic (Schoox ID, external ID, email). This provides context beyond the schema's type descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to look up Schoox user profiles and badges. It distinguishes from sibling tools like 'dashboard' by specifying that for training progress and analytics, the dashboard tool should be used instead. The sub-actions (list, get, get_badges) further clarify the specific capabilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('identity data') and when not to ('training progress... use dashboard instead'). It also provides guidance on sub-actions and parameter usage, such as requiring userId for 'get' and 'get_badges', and listing filters for 'list'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose, with descriptions explicitly guiding which tool to use for what. For example, 'content' is for browsing all content types while 'courses' is course-specific; 'dashboard' is for progress/analytics while 'users' is for profile data. No two tools overlap in functionality.
All tool names are single-word nouns (e.g., aboves, badges, content, dashboard). Sub-actions follow a consistent verb_noun pattern (list, get, etc.). There is no mixing of naming conventions, and the pattern is predictable across the entire tool set.
With 15 tools covering organizational hierarchy, content, courses, events, exams, skills, users, groups, jobs, and analytics, the count is well-scoped for an LMS data-access server. Each tool serves a distinct domain area without unnecessary bloat.
The tool set provides comprehensive read-only coverage of major LMS entities (users, courses, content, skills, events, etc.) and includes analytics via the dashboard. However, there are no tools for create/update/delete operations, which may be a gap if the server's purpose extends beyond querying. Minor missing entities like certificates or announcements do not significantly hinder the core functionality.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Ask data questions in natural language. Get SQL, insights, and charts from your databases.
Create, edit, translate, and export SCORM eLearning modules from a connected AI assistant.
Ask business questions in plain English. Get instant answers from your database, no SQL needed.
Query BigQuery, Snowflake, Redshift & Azure Synapse with natural language
Related MCP Servers
- AlicenseAqualityFmaintenanceEnables AI assistants to query Bullhorn CRM data using natural language through direct REST API access with OAuth 2.0 authentication.61MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language queries about Magento store catalog, sales, and customer data through dynamic tools for AI assistants.MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language querying of SQL databases using AI, supporting multiple database types and automatic schema discovery.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying your team's work (stats, overdue, workload, active members, etc.) via natural language, scoped to your department with read-only signed-token access.46MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/schoox/schoox-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server