Tools

Cademí MCP offers 396 tools: 5 composite tools that answer common questions in one call, and 391 tools that each call one operation of the Cademí API v3, release 3.4.7. The full list, with the permissions and annotations of each tool, is in the tool catalog.

Composite tools

ToolAnswers
student_contextWho a student is, what they are enrolled in, and which products they can access.
student_access_contextWhether a student can access one product and why, with reason codes, evidence, and suggested actions.
product_contextWhat a product is, its top-level content, how it is sold, and its access schedules.
product_structureThe complete module and lesson tree of a product.
instance_overviewWhich account the connection works on, its status and limits, and its API usage.

All five are read-only. They never change data: when a fix exists, student_access_context suggests the tool to use, and the assistant calls it separately, with your approval.

How students and products are found

Composite tools take a student as a public ID (usr_...), an e-mail address, or a name, and a product as a public ID (prd_...) or a name. You never need to look up an ID first.

  • Public ID. The student or product is retrieved directly.
  • E-mail. The tool searches the account's students and keeps the one whose e-mail matches exactly, ignoring case.
  • Name. The tool searches by the name and compares it with up to 20 results. Results whose name matches exactly, ignoring case, are kept. If none matches exactly, all results are kept.

When exactly one student or product is left, the tool uses it. When none is left, the tool returns RESOURCE_NOT_FOUND. When several are left, it returns AMBIGUOUS_REFERENCE instead of guessing, with up to 10 candidates in details.candidates, each with its id, name, and, for students, email:

{
  "error": {
    "code": "AMBIGUOUS_REFERENCE",
    "message": "2 students match \"Maria\". Ask the user which one they mean, then call again with its ID.",
    "retryable": false,
    "details": {
      "candidates": [
        { "id": "usr_01J8Z6", "name": "Maria Souza", "email": "[email protected]" },
        { "id": "usr_01J8Z7", "name": "Maria Lima", "email": "[email protected]" }
      ]
    }
  }
}

The assistant then asks you which one you mean and calls the tool again with its ID.

Partial results

A composite tool reads several API operations. When an optional part cannot be read, for example because the administrator lacks the permission for it, the tool still answers: that part is null, and an entry in warnings explains what is missing, with the error_code and the API request_id when there is one. When a required part fails, the whole call fails with an error. Authorization and capacity errors always fail the whole call.

Lists that a composite tool reads in several pages have a complete field. complete: false means there was more data than the tool reads: use the corresponding list tool with filters to see the rest.

student_context

Everything about one student, as the first step of a question about them.

InputDescription
studentRequired. A usr_ ID, an e-mail address, or a name.
OutputDescription
studentThe profile: ID, name, e-mail, status, access, whether they are in the trash, external ID, creation date, and tags.
enrollmentsAll the student's enrollments, with status, origin, products, delivery, and end dates.
productsThe student's effective access to each product: has_access, denial_reason, start and end dates, and sources.
summaryEnrollments by status, and how many products the student can and cannot access.
warningsParts that could not be read.

Permissions: users.read. Enrollments and product access also need enrollments.read; without it, they come back null with a warning.

student_access_context

Whether one student can access one product, and why. Use it for questions such as "why can't João access the Marketing course?" or "why doesn't Maria see module 3?".

InputDescription
studentRequired. A usr_ ID, an e-mail address, or a name.
productRequired. A prd_ ID or a name.
OutputDescription
student, productThe student and the product, including their status and whether they are in the trash.
accessThe API's verdict for this student and product: has_access, denial_reason, starts_at, ends_at, sources, and overrides.
enrollmentsThe student's enrollments that include this product.
releaseThe release calendar: how many modules and lessons are released, scheduled, hidden, or waiting for an exam, the next release date, and up to 20 entries that are not released yet.
progressThe student's progress in the product: percentage, completed and total lessons, and activity dates.
diagnosiscan_access, the reasons with a code, severity, message, and evidence, and the suggested_actions.
warningsParts that could not be read.

The API decides whether the student has access: diagnosis.can_access is the API's has_access. The diagnosis explains that verdict with the reason codes below. Each reason has a severity: blocking explains why there is no access, warning points to something that needs attention, and info gives context. Each suggested action names the tool that fixes the problem and what it does, such as users_enrollments_create to grant a manual enrollment.

Permissions: users.read and products.read to find the student and the product, and enrollments.read for the access verdict. The enrollments and the release calendar also need enrollments.read, and progress needs progress.read; without them, those parts come back null with a warning.

Access reason codes

CodeMeaningSuggested action
STUDENT_DELETEDThe student is in the trash.users_update with deleted set to false.
PRODUCT_DELETEDThe product is in the trash.products_update with deleted set to false.
PRODUCT_DRAFTThe product is a draft and is not published to students.products_publications_create.
NO_ACCESSThe student has no active source of access to the product.users_enrollments_create.
PRODUCT_HIDDENThe product is hidden for this student.
ACCESS_COMING_SOONThe product is marked as coming soon and is not open yet.
ACCESS_NOT_STARTEDAccess starts at a future date.users_products_access_update to adjust the student's access dates.
ACCESS_ENDEDAccess ended at a past date.users_products_access_update to adjust the student's access dates.
EXAM_REQUIREDThe student must pass a required exam first.
CONTENT_IN_EDITThe product content is being edited and is temporarily unavailable.
INSUFFICIENT_PROGRESSThe student has not reached the progress that the release rules require.
NO_ENROLLMENTNo enrollment includes the product. When the student has access anyway, it comes from another source and the severity is info.users_enrollments_create.
ENROLLMENT_REVOKEDThe enrollment for the product was revoked.For a manual enrollment, users_enrollments_update to restore it.
ENROLLMENT_SUSPENDEDThe enrollment for the product is suspended.For a manual enrollment, users_enrollments_update to reactivate it.
ENROLLMENT_EXPIREDThe enrollment ended at its end date.For a manual enrollment, users_enrollments_update to extend it.
SUBSCRIPTION_ENDEDThe subscription behind the enrollment ended. Renewal happens on the payment gateway.
ENROLLMENT_ENDS_SOONAn active enrollment for the product ends within 7 days.
ACCESS_OVERRIDE_ACTIVEThe student has an individual access override for the product: a duration, an access schedule, or waived release rules.
CONTENT_PARTIALLY_RELEASEDThe student has access, but some modules or lessons are not released yet.

Enrollments that come from a sale or a subscription are managed by the payment gateway, so the suggested actions for revoked, suspended, and expired enrollments apply only to manual enrollments.

product_context

An overview of a product, to understand it before answering questions about it or changing it.

InputDescription
productRequired. A prd_ ID or a name.
OutputDescription
productThe product: ID, name, format, status, whether it is in the trash, showcase, module and lesson counts, external ID, and dates.
contentModule, lesson, and draft counts, and the top-level modules and lessons.
deliveriesThe deliveries that grant the product, with their gateway, visibility, and enrollment and product counts.
access_schedulesThe product's access schedules.
warningsParts that could not be read.

Permissions: products.read. Deliveries also need deliveries.read, and access schedules need access_schedules.read; without them, those parts come back null with a warning.

product_structure

The complete content tree of a product: every module and lesson, nested and in order, with its status and totals.

InputDescription
productRequired. A prd_ ID or a name.
include_draftsOptional. Include draft modules and lessons. Defaults to true.
OutputDescription
productThe product: ID, name, format, status, and module and lesson counts.
treeThe modules and lessons, each with id, kind (module or lesson), name, status, and position. Modules have children and children_complete.
totalsThe number of modules, lessons, and drafts in the tree.
completefalse when part of the tree could not be read.
warningsParts that could not be read.

The tree goes down four levels, and the tool expands up to 150 modules. A module that was not expanded has children_complete: false: read its content with modules_content_list.

Permissions: products.read, and modules.read to expand modules. Without modules.read, modules come back with children_complete: false and a warning.

instance_overview

The account this connection works on. Use it to confirm the account before making changes, or for questions about the account's status and limits.

This tool takes no input.

OutputDescription
connectionThe account ID (instance_id), the administrator the connection acts as (administrator_id), and the environment.
accountThe account: ID, name, environment, billing and blocking status, student quota, replica and sandbox relationships, and creation date.
usageAPI usage over the last 24 hours: requests, operations, and rate limits.
warningsParts that could not be read.

Permissions: account.read. Usage also needs usage.read; without it, usage comes back null with a warning.

Tools per operation

Every operation of the API v3 has a tool, generated from the API contract, except the four listed in Operations without a tool. The tool name is the operation ID with dots replaced by underscores:

Operation IDTool
users.listusers_list
products.updateproducts_update
users.enrollments.createusers_enrollments_create

The tool title is the operation summary, and the description adds the operation's description, how to page, whether the tool changes or removes data, the body fields, and the permission it requires. Some descriptions point to a composite tool that answers the same question in one call. For the parameters and fields of each operation, see the API reference.

Input

FieldDescription
Path and query parametersTop-level fields with the names the API uses, such as user_id, limit, and cursor.
bodyThe JSON request body, for operations that take one.
if_matchFor operations that accept If-Match: the revision of the resource you read earlier. If the resource changed since then, the call fails with CONFLICT.
idempotency_keyFor operations that accept Idempotency-Key. Optional: a new key is generated when you omit it. Reuse a key only to retry a call whose outcome was uncertain, so it is not applied twice.

Fields outside the operation's schema are rejected.

Output

Operation returnsTool returns
A listitems and page. Pass page.next_cursor as cursor to get the next page (Pagination and filtering).
An objectThe object.
No contentAn empty object.
An asynchronous operationThe operation. Follow it with operations_get (Asynchronous operations).

A list tool returns one page per call. Use the operation's filters to narrow the results instead of paging through a whole collection.

Operations without a tool

The API release 3.4.7 has 395 operations. Four of them have no tool on purpose:

OperationWhyInstead
credentials.createIt returns a new credential secret, which would end up in the conversation.Create credentials in the Cademí dashboard.
credentials.secret_rotations.createIt returns a new credential secret, for the same reason.Rotate secrets in the Cademí dashboard.
event_streams.events.getIt is a continuous stream of events, not a request with a single response.Event streams, or cademi listen.
openapi.getIt returns the whole API contract, which is metadata about the API. Every operation is already a tool.The API reference.

Annotations

Every tool carries MCP annotations, so your client can tell reads from changes and ask for your approval before a change:

AnnotationSet on
readOnlyHint: trueTools that only read: the composite tools and every tool for a GET operation.
destructiveHint: trueDeletes, full replacements (PUT), and writes that remove, revoke, cancel, reset, suspend, or overwrite data. This includes users_enrollments_update, which can revoke an enrollment, and operations_update, which cancels an operation.
idempotentHint: trueReads, updates, replacements, and deletes. Tools for POST operations are not idempotent.
openWorldHint: trueWrites that can send e-mails or notify external systems, such as the e-mail and webhook operations.

The annotations describe the tool. The API still checks every call against the administrator's permissions (Authorization and permissions).

Each tool also publishes metadata in _meta:

KeyValue
dev.cademi/tool_typecomposite or primitive (a tool per operation).
dev.cademi/permissionsThe permissions the tool requires.
dev.cademi/operation_idTools per operation: the API operation ID.
dev.cademi/httpTools per operation: the method and route of the operation.
dev.cademi/conditional_permissionsTools per operation: permissions required only for some inputs, when there are any.

Results

A successful call returns the result as structuredContent and the same JSON as text. Composite tools declare an output schema.

When a result is larger than the response size limit, it is shortened and says so with truncated: true and a truncation object that explains what was omitted and how to get the rest. A failed call returns an error with a stable code. See Errors and limits.

On this page