Skip to main content
Glama

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+

  • uv installed

  • A 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-mcp

Run from a local clone

git clone https://github.com/dbuxton/litmos-mcp
cd litmos-mcp
LITMOS_API_KEY=your_key uvx --from . litmos-mcp

Configuration

All configuration is via environment variables:

Variable

Required

Default

Description

LITMOS_API_KEY

Yes

Your Litmos API key

LITMOS_REGION

No

us

API region: us, eu, or au

LITMOS_SOURCE

No

litmos-mcp

Source label sent with every API request

Region endpoints

Region

Base URL

us

https://api.litmos.com/v1.svc

eu

https://api.litmoseu.com/v1.svc

au

https://api.litmos.com.au/v1.svc

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_here

Or 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

litmos_search_users

Search users by name, email, username, or company

litmos_get_user

Retrieve a full user profile by encrypted user ID

litmos_list_users

List all users with pagination support

litmos_get_user_courses

Get all courses assigned to a user with completion status

litmos_get_user_course_results

Get module-level results for a specific user/course pair

litmos_get_user_learning_paths

Get learning paths assigned to a user

litmos_list_courses

List all courses in the organisation

litmos_get_user_teams

Get teams a user belongs to

Typical workflow

  1. Find a user — use litmos_search_users with a name or email to get their encrypted Id.

  2. Check training — use litmos_get_user_courses with that Id to see all assigned courses and completion status.

  3. Drill into a course — use litmos_get_user_course_results with the user Id and course Id for 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-mcp

License

MIT

Available Tools

8 tools
litmos_get_userA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_resultsA
Read-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 }, ...] }

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_coursesA
Read-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 }, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_pathsA
Read-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 }, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_teamsA
Read-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}, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_coursesA
Read-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, ...}, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_usersA
Read-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}, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_usersA
Read-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}, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 8 tool updatesv0.1.0
    • First observedlitmos_get_user
    • First observedlitmos_get_user_course_results
    • First observedlitmos_get_user_courses
    • First observedlitmos_get_user_learning_paths
    • First observedlitmos_get_user_teams
    • First observedlitmos_list_courses
    • First observedlitmos_list_users
    • First observedlitmos_search_users

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency5/5

All tools follow the consistent pattern 'litmos_verb_noun' (e.g., litmos_get_user, litmos_list_courses), with clear verb-noun combinations.

Tool Count5/5

8 tools is well-scoped for an LMS read-only integration, covering essential entities without unnecessary bloat.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers