Skip to main content
Glama
curricula-mcp

curricula-mcp

by Decian-Inc

Curricula MCP

An MCP server that exposes all 44 operations in the Huntress Curricula public API. It uses the OAuth access token issued by Curricula and supports the production and development-sandbox APIs.

Install

pip install curricula-mcp

Or run from a checkout:

pip install -e .

Related MCP server: cloudradial-mcp

Configure

Create an OAuth access token with the Curricula scopes required for the operations you plan to use, then set:

export CURRICULA_ACCESS_TOKEN="your-access-token"
# Optional; default is production.
export CURRICULA_BASE_URL="https://mycurricula.com/api/v1"

For group, learner, and assignment management, the Curricula OAuth client must be granted assignments:read, assignments:manage, learners:read, and learners:manage. The server requests those scopes by default when configured with CURRICULA_CLIENT_ID and CURRICULA_CLIENT_SECRET; a pre-issued CURRICULA_ACCESS_TOKEN must carry them already.

For the development sandbox, set CURRICULA_BASE_URL=https://dev.curricula.com/api/v1.

The server sends Authorization: Bearer <token> and uses the JSON:API media type. See the Curricula authentication and scopes documentation.

Connect an MCP client

{
  "mcpServers": {
    "curricula": {
      "command": "curricula-mcp",
      "env": {
        "CURRICULA_ACCESS_TOKEN": "your-access-token"
      }
    }
  }
}

Each API operation is an MCP tool. Supply URI identifiers through path_params, filters/pagination/includes through query, and JSON:API request content through body. For example:

{
  "path_params": {"accountId": "abc123"},
  "query": {"include": "learners", "page": 1, "perPage": 50}
}

See TOOLS.md for the complete catalog.

Safety

Most tools are read-only. State-changing tools, including group movement and assignment enrollment, forward the request immediately. Agents should confirm intent before calling them.

Development

pip install -e ".[dev]"
pytest

Available Tools

44 tools
create_admin_userA

Create an administrator user. Calls POST /users. Put route IDs in path_params and filtering, pagination, sorting, or include values in query. Provide the JSON:API payload in body.

Inputs: body, query, path_params. Returns: object

delete_accountB

Permanently delete an account. Calls DELETE /accounts/{accountId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

delete_admin_userA

Permanently delete an administrator user. Calls DELETE /users/{userId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_accountA

Get an account's details. Calls GET /accounts/{accountId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_account_summary_reportA

Get an account summary report. Calls GET /account-summary-reports/{accountSummaryReportId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_admin_userB

Get administrator user details. Calls GET /users/{userId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_assignmentA

Get assignment details. Calls GET /assignments/{assignmentId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_assignment_completion_certificateB

Get a learner's assignment completion certificate. Calls GET /assignments/{assignmentId}/completion-certificate. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_assignment_learner_activityB

Get learner activity for an assignment. Calls GET /assignments/{assignmentId}/learner-activity. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_departmentA

Get department details. Calls GET /departments/{departmentId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_episodeA

Get training episode details. Calls GET /episodes/{episodeId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_groupC

Get learner group details. Calls GET /groups/{groupId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_learnerA

Get learner details. Calls GET /learners/{learnerId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_phishing_campaignA

Get phishing campaign details. Calls GET /phishing-campaigns/{phishingCampaignId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_phishing_campaign_scenarioB

Get a campaign-scenario's details. Calls GET /phishing-campaign-scenarios/{phishingCampaignScenarioId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_phishing_campaign_scenario_campaignA

Get the campaign related to a campaign-scenario. Calls GET /phishing-campaign-scenarios/{phishingCampaignScenarioId}/campaign. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_phishing_campaign_scenario_scenarioB

Get the phishing scenario related to a campaign-scenario. Calls GET /phishing-campaign-scenarios/{phishingCampaignScenarioId}/scenario. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

get_phishing_scenarioB

Get phishing scenario details. Calls GET /phishing-scenarios/{phishingScenarioId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_admin_usersB

List account administrators. Calls GET /accounts/{accountId}/users. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_assignmentsA

List assignments for an account. Calls GET /accounts/{accountId}/assignments. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_departmentsB

List departments in an account. Calls GET /accounts/{accountId}/departments. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_groupsA

List learner groups in an account. Calls GET /accounts/{accountId}/groups. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_learnersA

List learners in an account. Calls GET /accounts/{accountId}/learners. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_phishing_campaignsA

List phishing campaigns for an account. Calls GET /accounts/{accountId}/phishing-campaigns. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_phishing_scenariosA

List phishing scenarios for an account. Calls GET /accounts/{accountId}/phishing-scenarios. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_accountsA

List accounts available to the authenticated administrator. Calls GET /accounts. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_summary_reportsC

List account summary reports. Calls GET /account-summary-reports. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_account_summary_reports_for_accountB

List summary reports for an account. Calls GET /accounts/{accountId}/account-summary-reports. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_admin_usersC

List administrator users. Calls GET /users. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_assignment_enrollment_conditionsA

List assignment enrollment conditions. Calls GET /assignments/{assignmentId}/enrollment-conditions. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_assignment_enrollment_extrasB

List assignment enrollment extras. Calls GET /assignments/{assignmentId}/enrollment-extras. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_assignment_learnersA

List learners assigned to an assignment. Calls GET /assignments/{assignmentId}/learners. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_assignmentsA

List assignments. Calls GET /assignments. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_departmentsB

List departments. Calls GET /departments. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_episodesA

List training episodes. Calls GET /episodes. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_groupsC

List learner groups. Calls GET /groups. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_learnersB

List learners. Calls GET /learners. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_phishing_campaign_attemptsA

List phishing attempts for a campaign. Calls GET /phishing-campaigns/{phishingCampaignId}/attempts. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_phishing_campaignsC

List phishing campaigns. Calls GET /phishing-campaigns. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_phishing_campaign_scenario_attemptsB

List attempts for a campaign-scenario. Calls GET /phishing-campaign-scenarios/{phishingCampaignScenarioId}/attempts. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_phishing_campaign_scenariosA

List scenarios attached to a phishing campaign. Calls GET /phishing-campaigns/{phishingCampaignId}/campaign-scenarios. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

list_phishing_scenariosB

List phishing scenarios. Calls GET /phishing-scenarios. Put route IDs in path_params and filtering, pagination, sorting, or include values in query.

Inputs: body, query, path_params. Returns: object

report_phishing_attemptA

Mark a phishing attempt reported using a code or message ID. Calls POST /phishing-attempts/actions/report. Put route IDs in path_params and filtering, pagination, sorting, or include values in query. Provide the JSON:API payload in body.

Inputs: body, query, path_params. Returns: object

update_admin_userA

Update an administrator user. Calls PATCH /users/{userId}. Put route IDs in path_params and filtering, pagination, sorting, or include values in query. Provide the JSON:API payload in body.

Inputs: body, query, path_params. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 44 tools

    Disambiguation4/5

    Most tools have clear resource-and-scope distinctions, such as list_account_learners vs list_learners. However, list_account_summary_reports_for_account and list_account_summary_reports are nearly identical, and list_account_admin_users vs list_admin_users could easily be confused.

    Naming Consistency4/5

    Tool names overwhelmingly follow a consistent verb_noun snake_case pattern with list/get/create/update/delete prefixes. The main deviations are report_phishing_attempt, which uses an action verb rather than a CRUD prefix, and the awkward list_account_summary_reports_for_account name.

    Tool Count2/5

    44 tools is well above the well-scoped range, and many are thin GET wrappers around nested REST endpoints. The surface area could be meaningfully reduced by consolidating account-scoped list variants or using parameters.

    Completeness2/5

    The tool surface is heavily read-only: only admin users have full create/update/delete coverage, plus one report action. There are no mutation tools for accounts, assignments, departments, groups, learners, phishing campaigns, phishing scenarios, or episodes, so management workflows cannot complete.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables interaction with the Huntress SAT API to manage security awareness training, including learners, phishing campaigns, and training assignments. It supports OAuth2 authentication and optional role-based access control for secure organizational management.
      MIT
    • F
      license
      Not graded
      quality
      C
      maintenance
      Exposes the CloudRadial REST API (client portal / PSA-adjacent MSP platform) as MCP tools, enabling operations on companies, articles, feedback, archives, flexible assets, and more via 34 tools with HTTP Basic Auth.
      1
      -
    • A
      license
      Not graded
      quality
      C
      maintenance
      A hosted, OAuth-authenticated MCP endpoint exposing 176 tools that let AI assistants read and write jobs, candidates, applications, interviews, scorecards, prospects, talent pools, and imports within an organization's own applicant tracking data, scoped to the signed-in user's existing permissions.
      MIT
    • A
      license
      C
      quality
      C
      maintenance
      Exposes every operation in the ConnectSecure OpenAPI specification as an MCP tool, enabling vulnerability management, assets, assessments, integrations, and reporting.
      359
      MIT