curricula-mcp
# 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
```bash
pip install curricula-mcp
```
Or run from a checkout:
```bash
pip install -e .
```
## Configure
Create an OAuth access token with the Curricula scopes required for the operations you plan to use, then set:
```bash
export CURRICULA_ACCESS_TOKEN="your-access-token"
# Optional; default is production.
export CURRICULA_BASE_URL="https://mycurricula.com/api/v1"
```
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](https://curricula.stoplight.io/docs/curricula-api/90755b35b33f4-authentication).
## Connect an MCP client
```json
{
"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:
```json
{
"path_params": {"accountId": "abc123"},
"query": {"include": "learners", "page": 1, "perPage": 50}
}
```
See [TOOLS.md](TOOLS.md) for the complete catalog.
## Safety
Most tools are read-only. The five state-changing tools (`delete_account`, `report_phishing_attempt`, `create_admin_user`, `update_admin_user`, and `delete_admin_user`) forward the request immediately. Agents should confirm intent before calling them.
## Development
```bash
pip install -e ".[dev]"
pytest
```
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.