Skip to main content
Glama

enroll_user_product

Enroll a user in a course, bundle, or subscription by providing product ID, type, price, and optional duration or email notification.

Instructions

๐ŸŸก WRITE ยท creates data ยท POST /v2/users/{id}/enrollment

Enroll user to product, regarding course, bundle, manual subscription

Behavior: creates a record or triggers an action in the live school. Not idempotent: a repeated call can duplicate the effect. Auth (admin API token + Lw-Client id) is injected server-side, never by the model; calls are throttled to stay under LearnWorlds' 30-per-10s cap and retried on 429/5xx. Parameters: the whole JSON payload goes in the single body argument, forwarded verbatim (the spec leaves body optional, but this endpoint expects one). Returns: HTTP <status> followed by the LearnWorlds JSON response body. A non-2xx reply surfaces as a tool error with that status and the API error payload โ€” 401 bad/expired token, 403 not permitted, 404 no such record, 422 rejected input. Use when: only when the user asked to create this. Check with a ๐ŸŸข read tool that the target exists and the record is not already there. Related Users tools: unenroll_user_product, get_courses_enrollments_user, get_products_user, get_seat_offerings_that_user_is_member, get_user.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesUser Id or email (encoded string)
bodyNoRequest body (application/json).

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. First observedv1.0.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations: it explains the real-world effect ('creates a record or triggers an action in the live school'), the non-idempotency consequence (duplicate effect on repeated call), server-side auth injection, 30-per-10s throttling with 429/5xx retry, and detailed error semantics (401/403/404/422 mapped to meanings). This adds substantial behavioral context that annotations alone do not convey, and it is fully consistent with readOnlyHint=false, idempotentHint=false, and destructiveHint=false.

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 longer than average but the tool is genuinely complex (auth, throttling, non-idempotency, error handling, no output schema), and each labeled section (Behavior, Parameters, Returns, Use when) earns its place. The front-loaded '๐ŸŸก WRITE ยท creates data ยท POST' line gives an immediate orientation, and the structured format keeps dense information scannable.

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?

For a non-idempotent write tool with no output schema, the description is complete: it covers return format (HTTP status + response body), failure behavior, authentication, rate limits, retry policy, required pre-checks, and related tools. Nothing an agent needs to invoke this correctly is missing.

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 coverage is 100%, so the baseline is 3. The description adds genuine value by clarifying that the entire JSON payload goes in the single 'body' argument forwarded verbatim and that although the spec marks body optional, the endpoint expects one โ€” a caveat that could prevent an agent from omitting a required payload. This is a meaningful semantic addition beyond the schema.

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 states a specific verb and resource โ€” "Enroll user to product" โ€” and specifies the product scope (course, bundle, manual subscription) with the exact POST endpoint. It clearly differentiates from the sibling unenroll_user_product and names the other related Users tools, so an agent can tell them apart without opening schemas.

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?

The 'Use when' section explicitly restricts invocation: 'only when the user asked to create this,' and gives a concrete precondition โ€” verify with a ๐ŸŸข read tool that the target exists and the record is not already there. It also lists the relevant sibling tools (unenroll_user_product, get_courses_enrollments_user, get_products_user, get_seat_offerings_that_user_is_member, get_user), providing both timing and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ohneben/Learnworlds-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server