Skip to content

TalentLMS MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.7.4 · published by io.usefulapi

Read TalentLMS users, courses, groups, branches and progress; create learners and enroll users.

Deletes · 3

23 tools: 3 can delete or cancel things and 20 only read.

Scanned Oct 22, 2026

No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http talentlms https://talentlms.usefulapi.io/mcp

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

23 tools

Deletes or cancels 3Claude Code: deny
  • add_user_to_groupWRITE: add an existing user to a group, which also enrolls them in the group's courses.No findings

    Why it is in this group

    • The name "add_user_to_group" says "add": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: add an existing user to a group, which also enrolls them in the group's courses. Set enroll_to_courses to enroll synchronously. POST /api/v2/group-memberships.

    Annotations the server declares

    • title: Add a user to a group
    • destructiveHint: true
  • create_userWRITE: create a new LEARNER account in the portal (TalentLMS may email the user, depending on the portal's settings).No findings

    Why it is in this group

    • The name "create_user" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: create a new LEARNER account in the portal (TalentLMS may email the user, depending on the portal's settings). The user type is always the portal's built-in Learner-Type; this tool cannot create administrators, instructors or any other type (the portal's default type is never used, since it may be an admin type). If the portal has no type named Learner-Type, the tool refuses. Returns the new user's id and type. POST /api/v2/users.

    Annotations the server declares

    • title: Create a learner
    • destructiveHint: true
  • enroll_user_in_courseWRITE: enroll an existing user in a course (as a learner).No findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: enroll an existing user in a course (as a learner). Returns the assigned role. POST /api/v2/enrollments.

    Annotations the server declares

    • title: Enroll a user in a course
    • destructiveHint: true
Only reads 20Claude Code: allow
  • get_branchDetails of one branch: URL, title, theme, default locale/timezone/user type/group, signup and verification settings, e-commerce settings.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "get_branch" says "get": a word for reading.

    What it can reach

    • private-dataThe name "get_branch" says "get" and "branch": it reads repositories.
    • private-dataThe description's first sentence says "branch": it reads repositories.
    • untrusted-inputThe description's first sentence says "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    Details of one branch: URL, title, theme, default locale/timezone/user type/group, signup and verification settings, e-commerce settings. GET /api/v2/branches/{id}.

    Annotations the server declares

    • title: Get a branch
    • readOnlyHint: true
  • get_courseFull details of one course: description, category, status, price, capacity, time limit, start/expiration, settings.No findings

    Why it is in this group

    • The name "get_course" says "get": a word for reading.
    Description, as the server wrote it
    Full details of one course: description, category, status, price, capacity, time limit, start/expiration, settings. GET /api/v2/courses/{id}.

    Annotations the server declares

    • title: Get a course
    • readOnlyHint: true
  • get_course_progressOne user's status in one course: enrolled or not, role, completion status, completion percentage and date, score, total time, last viewed unit and certificate.No findings

    Why it is in this group

    • The name "get_course_progress" says "get": a word for reading.
    Description, as the server wrote it
    One user's status in one course: enrolled or not, role, completion status, completion percentage and date, score, total time, last viewed unit and certificate. GET /api/v2/course-progress?user_id=&course_id=.

    Annotations the server declares

    • title: Get a user's progress in a course
    • readOnlyHint: true
  • get_groupDetails of one group: name, description, branch, group key, max key redemptions, price.Reads private dataNo findings

    Why it is in this group

    • The name "get_group" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "branch": it reads repositories.
    Description, as the server wrote it
    Details of one group: name, description, branch, group key, max key redemptions, price. GET /api/v2/groups/{id}.

    Annotations the server declares

    • title: Get a group
    • readOnlyHint: true
  • get_portal_statisticsPortal-wide totals (users, courses, categories, groups, branches, monthly active users) and settings (signup method, date format, branch limit).Reads private dataNo findings

    Why it is in this group

    • The name "get_portal_statistics" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "branch": it reads repositories.
    Description, as the server wrote it
    Portal-wide totals (users, courses, categories, groups, branches, monthly active users) and settings (signup method, date format, branch limit). A good first call. GET /api/v2/statistics.

    Annotations the server declares

    • title: Get portal statistics
    • readOnlyHint: true
  • get_timelineRecent portal events (logins, user/course/group/branch changes, course completions, certificates...) with the user and related course/group/branch/unit.Reads private dataNo findings

    Why it is in this group

    • The name "get_timeline" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "branch": it reads repositories.
    Description, as the server wrote it
    Recent portal events (logins, user/course/group/branch changes, course completions, certificates...) with the user and related course/group/branch/unit. Filter by event type (e.g. course_completion, user_login_user, user_create_user) and a date range. GET /api/v2/timeline.

    Annotations the server declares

    • title: Get timeline
    • readOnlyHint: true
  • get_userFull profile of one user: login, name, email, user type, status, timezone, locale, credits, custom fields, deactivation date.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "get_user" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "email": it reads mail.
    • untrusted-inputThe description's first sentence says "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    Full profile of one user: login, name, email, user type, status, timezone, locale, credits, custom fields, deactivation date. GET /api/v2/users/{id}.

    Annotations the server declares

    • title: Get a user
    • readOnlyHint: true
  • list_branch_usersUsers in a branch (id, login, name, email, user type, status, last login), paginated.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "list_branch_users" says "list": a word for reading.

    What it can reach

    • private-dataThe name "list_branch_users" says "list" and "branch": it reads repositories.
    • private-dataThe description's first sentence says "branch": it reads repositories.
    • untrusted-inputThe description's first sentence says "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    Users in a branch (id, login, name, email, user type, status, last login), paginated. GET /api/v2/branches/{id}/users.

    Annotations the server declares

    • title: List a branch's users
    • readOnlyHint: true
  • list_branchesList the portal's branches (sub-portals: id, name, URL, description, active), paginated.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "list_branches" says "list": a word for reading.

    What it can reach

    • private-dataThe name "list_branches" says "list" and "branch": it reads repositories.
    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    • untrusted-inputThe description's first sentence says "list" and "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    List the portal's branches (sub-portals: id, name, URL, description, active), paginated. GET /api/v2/branches.

    Annotations the server declares

    • title: List branches
    • readOnlyHint: true
  • list_categoriesThe course category tree (id, parent, name, price, children), paginated.No findings

    Why it is in this group

    • The name "list_categories" says "list": a word for reading.
    Description, as the server wrote it
    The course category tree (id, parent, name, price, children), paginated. GET /api/v2/categories.

    Annotations the server declares

    • title: List course categories
    • readOnlyHint: true
  • list_course_usersUsers enrolled in a course with their enrollment date, completion status, completion percentage, completion date and total time: the course's progress report.No findings

    Why it is in this group

    • The name "list_course_users" says "list": a word for reading.
    Description, as the server wrote it
    Users enrolled in a course with their enrollment date, completion status, completion percentage, completion date and total time: the course's progress report. GET /api/v2/courses/{id}/users.

    Annotations the server declares

    • title: List a course's users
    • readOnlyHint: true
  • list_coursesList the portal's courses (id, name, code, category, status, price, dates, catalog visibility), paginated.No findings

    Why it is in this group

    • The name "list_courses" says "list": a word for reading.
    Description, as the server wrote it
    List the portal's courses (id, name, code, category, status, price, dates, catalog visibility), paginated. Optionally only courses with a given custom course field value. GET /api/v2/courses.

    Annotations the server declares

    • title: List courses
    • readOnlyHint: true
  • list_group_usersMembers of a group (id, login, name, email, user type, status, last login), paginated.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "list_group_users" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "email": it reads mail.
    • untrusted-inputThe description's first sentence says "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    Members of a group (id, login, name, email, user type, status, last login), paginated. GET /api/v2/groups/{id}/users.

    Annotations the server declares

    • title: List a group's users
    • readOnlyHint: true
  • list_groupsList the portal's groups (id, name, description, branch, price, key redemptions), paginated.Reads private dataNo findings

    Why it is in this group

    • The name "list_groups" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "branch": it reads repositories.
    Description, as the server wrote it
    List the portal's groups (id, name, description, branch, price, key redemptions), paginated. GET /api/v2/groups.

    Annotations the server declares

    • title: List groups
    • readOnlyHint: true
  • list_learning_pathsLearning paths (sequences of courses) with status, category, price, dates and rules, paginated.No findings

    Why it is in this group

    • The name "list_learning_paths" says "list": a word for reading.
    Description, as the server wrote it
    Learning paths (sequences of courses) with status, category, price, dates and rules, paginated. GET /api/v2/learning-paths.

    Annotations the server declares

    • title: List learning paths
    • readOnlyHint: true
  • list_user_branchesThe branches a user belongs to (id, name).Reads private dataNo findings

    Why it is in this group

    • The name "list_user_branches" says "list": a word for reading.

    What it can reach

    • private-dataThe name "list_user_branches" says "list" and "branch": it reads repositories.
    • private-dataThe description's first sentence says "branch": it reads repositories.
    Description, as the server wrote it
    The branches a user belongs to (id, name). GET /api/v2/users/{id}/branches.

    Annotations the server declares

    • title: List a user's branches
    • readOnlyHint: true
  • list_user_certificatesCertificates a user has earned (course, issue and expiration dates, download/public URLs).Reads text others writeNo findings

    Why it is in this group

    • The name "list_user_certificates" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe description's first sentence says "issue": it reads issues, which other people can write.
    Description, as the server wrote it
    Certificates a user has earned (course, issue and expiration dates, download/public URLs). GET /api/v2/users/{id}/certificates.

    Annotations the server declares

    • title: List a user's certificates
    • readOnlyHint: true
  • list_user_coursesThe courses a user is enrolled in, with their role (learner/instructor), enrollment and completion dates, completion status and percentage, score and total time.No findings

    Why it is in this group

    • The name "list_user_courses" says "list": a word for reading.
    Description, as the server wrote it
    The courses a user is enrolled in, with their role (learner/instructor), enrollment and completion dates, completion status and percentage, score and total time. GET /api/v2/users/{id}/courses.

    Annotations the server declares

    • title: List a user's courses
    • readOnlyHint: true
  • list_user_groupsThe groups a user belongs to (id, name).No findings

    Why it is in this group

    • The name "list_user_groups" says "list": a word for reading.
    Description, as the server wrote it
    The groups a user belongs to (id, name). GET /api/v2/users/{id}/groups.

    Annotations the server declares

    • title: List a user's groups
    • readOnlyHint: true
  • list_usersList the portal's users (id, login, name, email, user type, status, registration, last login), paginated.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "list_users" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "email": it reads mail.
    • untrusted-inputThe description's first sentence says "list" and "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    List the portal's users (id, login, name, email, user type, status, registration, last login), paginated. Filter by keyword (name/login/email), exact email or login, status, branch, group, last-updated range or a custom field value. GET /api/v2/users.

    Annotations the server declares

    • title: List users
    • readOnlyHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Reads text others write7
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Install

Pinned to version 1.7.4. Values in angle brackets are yours to fill in.

claude mcp add --transport http talentlms https://talentlms.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__talentlms__get_portal_statistics",
      "mcp__talentlms__get_timeline",
      "mcp__talentlms__list_users",
      "mcp__talentlms__get_user",
      "mcp__talentlms__list_user_courses",
      "mcp__talentlms__list_user_groups",
      "mcp__talentlms__list_user_branches",
      "mcp__talentlms__list_user_certificates",
      "mcp__talentlms__get_course_progress",
      "mcp__talentlms__list_courses",
      "mcp__talentlms__get_course",
      "mcp__talentlms__list_course_users",
      "mcp__talentlms__list_categories",
      "mcp__talentlms__list_learning_paths",
      "mcp__talentlms__list_groups",
      "mcp__talentlms__get_group",
      "mcp__talentlms__list_group_users",
      "mcp__talentlms__list_branches",
      "mcp__talentlms__get_branch",
      "mcp__talentlms__list_branch_users"
    ],
    "ask": [],
    "deny": [
      "mcp__talentlms__create_user",
      "mcp__talentlms__enroll_user_in_course",
      "mcp__talentlms__add_user_to_group"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as talentlms. Review it before you use it.

Capability tags behind 12 rules
  • mcp__talentlms__get_portal_statistics private-data
  • mcp__talentlms__get_timeline private-data
  • mcp__talentlms__list_users private-data, untrusted-input
  • mcp__talentlms__get_user private-data, untrusted-input
  • mcp__talentlms__list_user_branches private-data
  • mcp__talentlms__list_user_certificates untrusted-input
  • mcp__talentlms__list_groups private-data
  • mcp__talentlms__get_group private-data
  • mcp__talentlms__list_group_users private-data, untrusted-input
  • mcp__talentlms__list_branches private-data, untrusted-input
  • mcp__talentlms__get_branch private-data, untrusted-input
  • mcp__talentlms__list_branch_users private-data, untrusted-input