litmos-mcp
Click on "Deploy 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., "@litmos-mcpfind user sarah.johnson@example.com"
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.
litmos-mcp
An MCP server that provides read-only access to the Litmos LMS REST API. Expose training completion status, user profiles, course results, and learning path data to any MCP-compatible AI client.
Prerequisites
Python 3.11+
uvinstalledA Litmos API key (Account Owner access required)
Related MCP server: rustici-mcp-server
Quick start
Run directly from GitHub
LITMOS_API_KEY=your_key uvx --from git+https://github.com/dbuxton/litmos-mcp litmos-mcpRun from a local clone
git clone https://github.com/dbuxton/litmos-mcp
cd litmos-mcp
LITMOS_API_KEY=your_key uvx --from . litmos-mcpConfiguration
All configuration is via environment variables:
Variable | Required | Default | Description |
| Yes | — | Your Litmos API key |
| No |
| API region: |
| No |
| Source label sent with every API request |
Region endpoints
Region | Base URL |
|
|
|
|
|
|
MCP client configuration
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"litmos": {
"command": "uvx",
"args": ["--from", "git+https://github.com/dbuxton/litmos-mcp", "litmos-mcp"],
"env": {
"LITMOS_API_KEY": "your_key_here",
"LITMOS_REGION": "us"
}
}
}
}Claude Code
claude mcp add litmos \
--command uvx \
--args "--from,git+https://github.com/dbuxton/litmos-mcp,litmos-mcp" \
--env LITMOS_API_KEY=your_key_hereOr add directly to .claude/mcp.json in your project:
{
"mcpServers": {
"litmos": {
"command": "uvx",
"args": ["--from", "git+https://github.com/dbuxton/litmos-mcp", "litmos-mcp"],
"env": {
"LITMOS_API_KEY": "your_key_here"
}
}
}
}Available tools
Tool | Description |
| Search users by name, email, username, or company |
| Retrieve a full user profile by encrypted user ID |
| List all users with pagination support |
| Get all courses assigned to a user with completion status |
| Get module-level results for a specific user/course pair |
| Get learning paths assigned to a user |
| List all courses in the organisation |
| Get teams a user belongs to |
Typical workflow
Find a user — use
litmos_search_userswith a name or email to get their encryptedId.Check training — use
litmos_get_user_courseswith thatIdto see all assigned courses and completion status.Drill into a course — use
litmos_get_user_course_resultswith the userIdand courseIdfor module-level scores and attempt counts.
API notes
The Litmos REST API enforces a limit of 100 requests per minute per API key. The server surfaces a clear error if this is exceeded.
All tools are read-only — no write operations are exposed.
Encrypted IDs returned by list/search endpoints must be used verbatim with other tools; do not attempt to decode or construct them manually.
Development
git clone https://github.com/dbuxton/litmos-mcp
cd litmos-mcp
uv sync
LITMOS_API_KEY=your_key uv run litmos-mcpLicense
MIT
Available Tools
8 toolslitmos_get_userARead-onlyIdempotent
Retrieve the full profile for a single Litmos user by their encrypted ID.
Args: params: UserIdInput with: - user_id (str): Litmos encrypted user ID
Returns: str: JSON object with full user profile including Id, UserName, FirstName, LastName, Email, AccessLevel, Active, LastLogin, JobTitle, ExternalEmployeeId, CustomField1-10, and more.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds no behavioral context beyond stating it 'retrieves' data. It does not mention permissions, rate limits, or side effects, but the annotations sufficiently cover the safety profile. Slight missed opportunity to reinforce safety.
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: a one-sentence summary followed by structured Args/Returns sections. Every sentence contributes meaning, and the most critical information (what the tool does) is front-loaded. No redundant or verbose phrasing.
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?
The description includes a return type and lists example fields, which compensates for the output schema not being shown. It covers the essential context for a simple retrieval tool. However, it does not explain how this tool relates to siblings that also access user data, which could reduce completeness for agents choosing among them.
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?
The description repeats the schema's parameter description for user_id ('Litmos encrypted user ID (returned by search/list tools)') without adding new information. Since the schema already defines the parameter with a description, the description offers minimal additional semantic value. The top-level text mentions 'by their encrypted ID' but lacks depth.
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 the full profile of a single Litmos user by encrypted ID. It specifies the action (Retrieve) and the resource (full profile for a single Litmos user). However, it does not differentiate itself from sibling tools like litmos_get_user_courses or litmos_get_user_teams, which retrieve subsets of the user data.
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 mentions that the user_id is a Litmos encrypted ID returned by search/list tools, providing a hint on where to obtain the ID. It does not explicitly state when to use this tool over siblings (e.g., when you need the full user profile vs. only courses). No guidance on when not to use it or alternatives is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
litmos_get_user_course_resultsARead-onlyIdempotent
Get detailed course and module-level results for a specific user/course pair.
Provides granular completion data including scores, attempt counts, and pass/fail status for each module within the course.
Args: params: UserCourseResultInput with: - user_id (str): Litmos encrypted user ID - course_id (str): Litmos encrypted course ID
Returns: str: JSON object with course-level fields plus a Modules array: { "Id": str, "Name": str, "Complete": bool, "PercentageComplete": float, "DateCompleted": str | null, "Modules": [{ "Id": str, "Name": str, "Completed": bool, "Score": int, "Passmark": int, "Attempt": int, "DateCompleted": str | null }, ...] }
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds value by detailing the return structure (scores, attempts, pass/fail) and field names, providing transparency beyond the 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?
The description is front-loaded with the main purpose and provides a clear example of the return structure. While the example is verbose, it is helpful and not overly long. No 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?
With an included output schema example and clear parameter descriptions, the description gives a complete picture of what the tool does, its inputs, and its outputs. No gaps remain.
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?
The input schema already describes each parameter as 'Litmos encrypted user ID' and 'Litmos encrypted course ID,' so the description's restatement adds no new semantics. With schema description coverage effectively 100%, the baseline 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?
The description explicitly states 'Get detailed course and module-level results for a specific user/course pair,' using a specific verb and resource. It clearly distinguishes from sibling tools like litmos_get_user_courses or litmos_get_user.
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 explains what the tool returns but does not explicitly state when to use it vs alternatives or provide any when-not-to-use guidance. Usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
litmos_get_user_coursesARead-onlyIdempotent
Get all courses assigned to a user and their completion status.
This is the primary tool for checking training completion. Returns each course with completion status, percentage, dates, and whether the user is overdue or compliant.
Args: params: UserIdInput with: - user_id (str): Litmos encrypted user ID
Returns: str: JSON array of course assignments: [{ "Id": str, "Name": str, "Code": str, "Active": bool, "Complete": bool, "PercentageComplete": float, "AssignedDate": str, "StartDate": str | null, "DateCompleted": str | null, "Overdue": bool, "CompliantTill": str | null, "IsLearningPath": bool }, ...]
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint. Description adds return schema and mentions 'overdue'/'compliant' fields, which is useful 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 a brief summary followed by parameter and return details. Efficient but could be slightly more concise.
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 single-parameter tool. Includes full return schema, and annotations cover safety. No missing context given the simplicity.
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 0% for the top-level param, but description explains 'user_id' in detail, including that it's returned by search/list tools, compensating 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?
Clearly states 'Get all courses assigned to a user and their completion status.' Verb, resource, and output are specific. Distinguishes from siblings by calling itself 'the primary tool for checking training completion.'
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 usage context by stating it's the primary tool for training completion, but does not explicitly mention when not to use or compare with siblings like 'litmos_get_user_course_results'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
litmos_get_user_learning_pathsARead-onlyIdempotent
Get all learning paths assigned to a user and their completion status.
Args: params: UserIdInput with: - user_id (str): Litmos encrypted user ID
Returns: str: JSON array of learning path assignments: [{ "Id": str, "Name": str, "Active": bool, "Complete": bool, "PercentageComplete": float, "AssignedDate": str, "StartDate": str | null, "DateCompleted": str | null, "AccessTillDate": str | null }, ...]
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and idempotentHint, so safety profile is covered. Description adds value by specifying the return structure with fields like PercentageComplete and DateCompleted, which goes 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?
Description uses a clean docstring format with Args and Returns sections. It is not overly long, though the Returns section is somewhat redundant with the output schema. Still, it is front-loaded and efficient.
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 (1 parameter, no enums, no nested objects) and the presence of output schema, the description is complete. It covers input, output, and behavioral aspects without missing critical information.
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 0%, but description fully documents the single parameter 'user_id' as 'Litmos encrypted user ID', compensating for the schema's lack of description. Output schema exists, but description also details return fields, further aiding comprehension.
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 'Get all learning paths assigned to a user and their completion status', which is a specific verb+resource combination. It distinguishes from sibling tools like litmos_get_user_courses (which gets courses) and litmos_get_user_teams.
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?
No explicit when-to-use or when-not-to-use guidance. The description implies use for learning path assignments, but does not mention alternatives or conditions such as 'use litmos_get_user_courses for course-level results'. Sibling names provide some context but description lacks direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
litmos_get_user_teamsARead-onlyIdempotent
Get all teams that a user is assigned to.
Useful for understanding a user's organisational grouping or filtering completion data by team membership.
Args: params: UserIdInput with: - user_id (str): Litmos encrypted user ID
Returns: str: JSON array of teams: [{"Id": str, "Name": str, "TeamCodeForBulkImport": str, "ParentTeamId": str}, ...]
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint. The description adds details about the return format (JSON array of teams with specific fields), which goes beyond what annotations provide.
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 extremely concise: one line for purpose, one for usage context, then param/return specs. No wasted words, properly 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?
Given the tool has only one parameter, annotations are present, and output schema is described, the description is complete enough for an agent to correctly invoke and use the 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 description coverage is 0%, but the tool description explains the parameter 'user_id (str): Litmos encrypted user ID', adding value beyond the schema's title and minLength. The output schema is also described.
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 'Get all teams that a user is assigned to', which is a specific verb-resource pair. It also provides usage context that distinguishes from sibling tools like litmos_get_user_courses.
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 explains when to use: 'for understanding a user's organisational grouping or filtering completion data by team membership'. It lacks explicit when-not-to-use or direct sibling comparison, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
litmos_list_coursesARead-onlyIdempotent
List courses available in the Litmos organisation.
Use the returned course IDs with litmos_get_user_course_results to fetch detailed results for a specific user/course combination.
Args: params: CourseListInput with: - limit (int): Records to return, default 100, max 1000 - start (int): Offset for pagination, default 0
Returns: str: JSON array of courses: [{"Id": str, "Name": str, "Code": str, "Active": bool, ...}, ...]
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the agent knows the tool is safe and idempotent. The description adds behavioral context about pagination (limit, start parameters) and the return format (JSON array with sample fields), which is valuable beyond the 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?
The description is concise with a clear structure: a lead sentence, a usage hint, an Args section with parameter details, and a Returns section with sample output. Every sentence adds value 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?
The description fully covers the tool's behavior: what it does, its parameters, and the return format (including sample fields). Though there is no explicit output schema, the provided sample structure plus annotations make the tool's behavior complete for this simple paginated list function.
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?
The input schema provides only type and constraints, with 0% description coverage. The description explains both parameters with their purpose, defaults, and bounds (e.g., 'limit (int): Records to return, default 100, max 1000'), which compensates well for the schema's lack of documentation.
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 function: 'List courses available in the Litmos organisation.' This explicitly identifies the verb (list) and resource (courses), differentiating it from sibling tools like litmos_list_users and litmos_get_user_courses.
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 a concrete usage example: 'Use the returned course IDs with litmos_get_user_course_results to fetch detailed results for a specific user/course combination.' This guides the agent on how to chain tools, though it does not explicitly exclude other usage patterns or compare to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
litmos_list_usersARead-onlyIdempotent
List users in the Litmos organisation with pagination support.
Returns basic user info (Id, UserName, FirstName, LastName). Use litmos_get_user for full profiles or litmos_search_users to find a specific individual.
Args: params: UserListInput with: - limit (int): Records to return, default 100, max 1000 - start (int): Offset for pagination, default 0 - show_inactive (bool): Include inactive users, default False
Returns: str: JSON array of users: [{"Id": str, "UserName": str, "FirstName": str, "LastName": str}, ...]
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds details on return format, pagination, and optional show_inactive, providing full 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?
Well-structured with a one-line summary, sibling distinctions, bulleted args, and return format. Every sentence adds value 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?
Comprehensive: covers purpose, usage, parameters, return format, and pagination. Annotations and output schema are well supplemented.
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?
Despite low schema coverage (0% at top level), the description explains each parameter (limit, start, show_inactive) with defaults, ranges, and purpose, fully compensating.
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 it lists users with pagination and returns basic info, and distinguishes from siblings litmos_get_user (full profiles) and litmos_search_users (find 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 guides when to use this tool vs alternatives: 'Use litmos_get_user for full profiles or litmos_search_users to find a specific individual.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
litmos_search_usersARead-onlyIdempotent
Search for Litmos users by name, email, username, or company.
Returns a list of matching users with their IDs. Use the returned Id values with other tools to retrieve training data for specific individuals.
Args: params: UserSearchInput with: - search (str): Search string (name, email, username, company)
Returns: str: JSON array of matching users: [{"Id": str, "UserName": str, "FirstName": str, "LastName": str}, ...]
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds value by detailing the return structure (list of users with Id, UserName, FirstName, LastName) and mentioning the relationship to other tools, which enriches behavioral understanding 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?
The description is well-structured with a clear first sentence, then usage advice, followed by detailed Args and Returns. Every sentence adds value, though the docstring format is slightly verbose. Good front-loading of the core 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 only one parameter, strong annotations, and an output schema, the description covers the necessary context: what to search, how to use results, and the return format. It could mention result limits or pagination, but is sufficiently complete for a search 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?
The parameter 'search' is already well-described in the input schema (matching against several fields). The description's Args section restates this without adding new meaning. With high schema coverage, a baseline 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?
The description clearly states it searches for Litmos users by name, email, username, or company, and specifies returns a list with IDs. It distinguishes from siblings like litmos_list_users and litmos_get_user by emphasizing search capability and ID usage for other 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?
The description explicitly tells users to use the returned Id values with other tools to retrieve training data, providing clear context for use. It does not explicitly state when not to use it versus alternatives, but the context signals and sibling names imply the tool is for searching before calling more specific tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
litmos_get_user - First observed
litmos_get_user_course_results - First observed
litmos_get_user_courses - First observed
litmos_get_user_learning_paths - First observed
litmos_get_user_teams - First observed
litmos_list_courses - First observed
litmos_list_users - First observed
litmos_search_users
TDQS
Scored across 8 tools
Each tool targets a distinct entity or relationship (user profile, user courses, course results, learning paths, teams, course list, user list, user search), with no overlapping purposes.
All tools follow the consistent pattern 'litmos_verb_noun' (e.g., litmos_get_user, litmos_list_courses), with clear verb-noun combinations.
8 tools is well-scoped for an LMS read-only integration, covering essential entities without unnecessary bloat.
Covers all main read operations for users, courses, learning paths, and teams. Minor gap: no tool to get details of a single course or list users in a team, but core workflows are supported.
Maintenance
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Read-only MCP server exposing a user ORANO library to their own AI agent.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Related MCP Servers
- AlicenseAqualityDmaintenanceRead-only MCP server that connects AI clients to Crescender's school asset, loan, member, and asset-comms API.6MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for interacting with Rustici LRS via xAPI, enabling statement retrieval, analytics, and aggregation operations.-
- FlicenseAqualityCmaintenanceRead-only MCP server providing Wealthi's AI Coach with scoped access to student progress data from Firestore and Supabase, enabling AI to retrieve student profiles, progress, assessment results, and learning signals without direct database credentials.6-
- FlicenseBqualityDmaintenanceRead-only FastMCP server for Canvas LMS study data.10-