curricula-mcp
curricula-mcp exposes Huntress Curricula API operations as MCP tools for reading most Curricula data and performing limited state-changing actions.
List/get accounts; delete an account.
Read assignments: assignments, assigned learners, learner activity, completion certificates, enrollment conditions/extras.
List/get departments, episodes, groups, and learners.
Read phishing data: campaigns, scenarios, campaign scenarios, and attempts; report a phishing attempt.
List account-scoped assignments, departments, groups, learners, phishing campaigns/scenarios, admin users, and summary reports.
List/get account summary reports.
Manage admin users: list/get/create/update/delete.
Use path_params for IDs, query for filters/pagination/includes, and JSON:API body for writes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@curricula-mcp List the active phishing simulation campaigns in production."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-mcpOr 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]"
pytestAvailable Tools
44 toolscreate_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
Scored across 44 tools
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.
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.
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.
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
One OAuth connector for your team's remote MCP servers, with Tool Packs, guardrails and logs.
Find, document and execute authenticated API calls across 1000+ apps via one MCP server
Discover, plan and run tools across your connected business systems through one OAuth MCP endpoint
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables 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
- FlicenseNot gradedqualityCmaintenanceExposes 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-
- AlicenseNot gradedqualityCmaintenanceA 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
- AlicenseCqualityCmaintenanceExposes every operation in the ConnectSecure OpenAPI specification as an MCP tool, enabling vulnerability management, assets, assessments, integrations, and reporting.359MIT