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.
23 tools: 3 can delete or cancel things and 20 only read.
Scanned Oct 22, 2026
- Deletes or cancels3Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads20Claude Code: allow: see these tools
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/mcpTools
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 private data11
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- 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/mcpRun 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.
{
"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