Inspect Steps, Catalog & Registry¶
Before you wire up a DAG or author a config, you need to know what exists: which steps are available, what each step consumes and produces, which builder strategy a step type binds, what its config fields are, and which pre-built pipelines you could start from. Cursus exposes all of this through read-only discovery commands.
Every discovery surface comes in two forms:
a CLI command (
cursus <group> <command>) for interactive use at a terminal, andan MCP tool (
<namespace>.<tool>) that an agent calls to get the same answer as a structured JSON envelope.
Both read the same underlying engine — the unified step catalog and the strategy registry — so the CLI and the agent can never disagree about what a step actually does. This guide pairs each command with its tool equivalent so you can move between the two freely.
The five discovery surfaces at a glance¶
CLI group |
MCP namespace |
What it answers |
|---|---|---|
|
|
What steps / builders / configs / config fields exist? |
|
|
What are a step’s I/O container paths and construction patterns? |
|
|
Which builder strategy + knobs does a step type bind? |
|
(via |
Registry contents, conflicts, name resolution, workspaces |
|
|
Which pre-built shared DAGs match my requirements? |
Most discovery commands accept --format json (the default is human-readable text;
for the catalog list-family, table is a deprecated alias for text), so any recipe
below can be piped into jq or consumed by scripts. The registry subcommands are the
exception — they print text only.
cursus catalog — steps, builders, configs, fields¶
The catalog group wraps cursus.step_catalog.StepCatalog. Start here when you don’t yet
know a step’s exact name.
List and search steps¶
# Every step known to cursus
cursus catalog list
# Filter by workspace, job type, or detected framework
cursus catalog list --framework xgboost --job-type training --limit 20
# Fuzzy search by name (scored matches, with component counts)
cursus catalog search xgboost
cursus catalog search preprocess --job-type training --format json
list calls catalog.list_available_steps(...) and can post-filter by
detect_framework(...). search calls catalog.search_steps(query, ...) and returns
match_score / match_reason per hit.
MCP equivalents:
catalog.list_steps {"job_type": "training"}
catalog.search {"query": "xgboost"}
catalog.list_steps accepts optional workspace_id and job_type; catalog.search
requires query and returns scored matches, each with components_available.
Inspect one step¶
# Registry data + framework + available components + job-type variants
cursus catalog show XGBoostTraining
cursus catalog show XGBoostTraining --format json
# Just the file components (script / contract / spec / builder / config)
cursus catalog components XGBoostTraining
cursus catalog components XGBoostTraining --type builder
# Detailed info about one component, optionally loading the class
cursus catalog component-info XGBoostTraining builder --load
show renders catalog.get_step_info(step_name) — its registry_data,
file_components, detected framework, and any _<job_type> variants.
component-info takes a component_type from
{config, builder, contract, spec, script} and, with --load, actually imports the
class to report e.g. a config’s field count or a spec’s dependency names.
MCP equivalent:
catalog.step_info {"step_name": "XGBoostTraining"}
Returns the step’s registry_data, config_class, builder_step_name,
sagemaker_step_type, detected framework, and components_available.
List builders, configs, contracts, specs, scripts¶
cursus catalog list-builders --step-type Training --show-path
cursus catalog list-configs --show-fields
cursus catalog list-contracts --with-scripts-only --show-entry-points
cursus catalog list-specs --job-type training --show-dependencies
cursus catalog list-scripts --show-path
list-buildersusesget_builders_by_step_type(step_type)(orget_all_builders()) and can print each builder’s registered SageMaker step type and file path.list-configsusesdiscover_config_classes(project_id);--show-fieldscounts each class’s Pydanticmodel_fields.list-contracts,list-specs, andlist-scriptsenumerate the corresponding component type across the catalog.
MCP equivalent (builders):
catalog.list_builders {"sagemaker_step_type": "Processing"}
Returns builder class names grouped by step name — with no instantiation.
Explore config fields¶
Two commands answer “what config does this step take?”:
# Every field on a step's config class, with types / defaults / required flags
cursus catalog fields XGBoostTraining --show-types --show-defaults --inherited
# Which config classes contain a given field name (reverse lookup)
cursus catalog search-field label_field --field-type str --show-default
fields looks up <StepName>Config in discover_config_classes() and walks its
model_fields. --inherited also prints the immediate parent config class via
get_immediate_parent_config_class(...). search-field scans every discovered config
class for a field of that name.
MCP equivalent:
catalog.config_fields {"step_name": "XGBoostTraining"}
Returns a fields list — each entry has name, type, required, default, and
description — resolved by mapping the step to its config class name via the registry.
Other catalog utilities¶
cursus catalog frameworks # frameworks detected across all steps + counts
cursus catalog workspaces # workspaces and their step / component counts
cursus catalog list-by-type Processing # steps whose sagemaker_step_type == Processing
cursus catalog metrics # catalog query / index performance report
cursus catalog discover --workspace-dir ./my_workspace # scan a directory for steps
catalog.resolve_step and catalog.step_spec (MCP-only)¶
Two catalog-namespace tools have no direct cursus catalog subcommand:
catalog.resolve_step {"step_name": "model_evaluation_xgb"}
catalog.step_spec {"step_name": "XGBoostTraining"}
catalog.resolve_stepmaps a canonical or file-style name (e.g.model_evaluation_xgb) to itsconfig_class,builder_class,spec_type, andsagemaker_step_type, usingcursus.registry.step_names. On the CLI, the closest equivalent iscursus registry resolve-step(below).catalog.step_specserializes a step’s specification to{step_type, node_type, dependencies, outputs}— the port-level I/O contract you need to wire a step into a DAG. It is complemented bycursus steps io/steps.io, which add container paths and channel fan-out.
cursus steps — a step’s I/O and construction view¶
Under the Strategy + Facade design, a step’s builder is a near-empty shell: the
container source/destination paths, the runtime property_path references, and the
training-channel fan-out live in the step’s .step.yaml interface plus its bound
handler, not in a readable builder class. The steps group renders that hidden wiring.
Both subcommands read cursus.steps.interfaces.io_view, so the view can never drift
from what the step actually wires.
steps io — inputs, outputs, paths, channels¶
cursus steps io XGBoostTraining
cursus steps io RiskTableMapping --job-type validation
cursus steps io XGBoostTraining --format json
For each input (consumer) it prints the logical name, container path, required flag,
type, compatible_sources, and the SageMaker training channels the input fans into
(e.g. input_path -> train / val / test). For each output (producer) it prints the
container path and the runtime property_path a downstream step resolves against.
MCP equivalent:
steps.io {"step_name": "XGBoostTraining"}
steps.io {"step_name": "TabularPreprocessing", "job_type": "training"}
Same view as JSON, plus convenience dependency_count / output_count. This is the
path/wiring complement to catalog.step_spec (ports + property paths, but no container
paths or channels).
steps patterns — how the step is assembled¶
cursus steps patterns XGBoostTraining
cursus steps patterns TabularPreprocessing --job-type calibration --format json
Shows the construction “plugins” the TemplateStepBuilder composes for the step: the
bound create_step handler, plus the env-var, job-argument, input, output, and compute
patterns — all derived from the .step.yaml contract data and the registry binding. A
⚠ custom override marker flags any axis the builder still hand-overrides. A
dependencies rollup reports the step’s third-party import footprint (build-time vs
runtime vs native-SageMaker-only).
MCP equivalent:
steps.patterns {"step_name": "XGBoostTraining"}
Both steps.* tools return a not_found failure (with catalog.list_steps /
catalog.search suggested as a remedy) when the step name has no interface.
cursus strategies — the builder strategy library¶
A step builder is no longer a class you open and read — it is a selection of
strategies plus knobs, bound at build time by the facade from the step’s
sagemaker_step_type (and, for Processing, its step_assembly). The strategies group
makes that selection space discoverable. Every subcommand reads
cursus.registry.strategy_registry, the same single source the runtime router uses.
# The routing axes (sagemaker_step_type, step_assembly) + strategy counts
cursus strategies axes
# Every registered strategy; columns: axis | name | verb | #knobs
cursus strategies list
cursus strategies list --axis sagemaker_step_type
# Full detail for one strategy: verb, handler, knobs, preset knobs
cursus strategies show Training
cursus strategies show code --axis step_assembly
# The authoring shortcut: "what builder do I get if I declare this step type?"
cursus strategies for Training
cursus strategies for Processing --step-assembly code
# Just the declarative knobs a strategy accepts
cursus strategies knobs --axis sagemaker_step_type --name Training
for is the highest-value command: given a sagemaker_step_type (plus --step-assembly
for Processing: code | step_args | delegation), it resolves the exact strategy the
facade would bind and lists its preset and available knobs — the replacement for reading
a builder class.
MCP equivalents:
CLI |
MCP tool |
|---|---|
|
|
|
|
|
|
|
|
|
|
strategies.for_step_type {"sagemaker_step_type": "Processing", "step_assembly": "code"}
When a name is ambiguous across axes, both the CLI and strategies.show ask you to pass
the disambiguating axis. When a step type binds no builder (e.g. builder-less types),
strategies.for_step_type returns a not_found failure pointing you at
strategies.list.
cursus registry — registry contents, resolution, and workspaces¶
The registry group manages the hybrid registry (core registry plus per-developer
workspace registries). It is broader than pure discovery — it also scaffolds and
validates — but the read-only subcommands are the registry counterpart to
catalog.resolve_step.
Inspect and resolve¶
# List steps in the (core or workspace) registry
cursus registry list-steps
cursus registry list-steps --workspace my_project --include-source
cursus registry list-steps --conflicts-only
# Validate a registry and optionally check for step-name conflicts
cursus registry validate-registry --workspace my_project --check-conflicts
# Resolve a step name to its config class / builder / framework
cursus registry resolve-step XGBoostTraining --workspace my_project
list-steps reads get_all_step_names(workspace); with a hybrid registry available it
groups by source registry and can surface conflicts via UnifiedRegistryManager.
resolve-step runs the full hybrid resolution (source registry + resolution strategy),
falling back to get_config_class_name / get_builder_step_name when the hybrid
manager is unavailable.
MCP equivalent — there is no dedicated registry.* MCP namespace; registry
resolution is exposed through the catalog namespace:
catalog.resolve_step {"step_name": "XGBoostTraining"}
Validate step definitions¶
# Validate a proposed step definition against standardization rules
cursus registry validate-step-definition \
--name MyCustomStep \
--config-class MyCustomStepConfig \
--builder-name MyCustomStepBuilder \
--sagemaker-type Processing \
--auto-correct
# Validation system status + performance metrics
cursus registry validation-status
cursus registry reset-validation-metrics
These wrap cursus.registry.validation_utils and are most useful when authoring new
steps — see Define a step pack.
Scaffold a workspace¶
cursus registry init-workspace my_project --template standard
Creates a developer workspace (interface-first layout:
src/cursus_dev/steps/{interfaces,configs,scripts} plus a local
src/cursus_dev/registry/workspace_registry.py) so you can register custom steps that
the catalog then discovers. Templates: minimal, standard, advanced.
CLI ↔ MCP quick reference¶
Task |
CLI |
MCP tool |
|---|---|---|
List steps |
|
|
Search steps |
|
|
Step metadata |
|
|
Step I/O ports |
(none) |
|
Config fields |
|
|
List builders |
|
|
Resolve a name |
|
|
Step I/O + paths + channels |
|
|
Step construction patterns |
|
|
Strategy axes |
|
|
List strategies |
|
|
Show a strategy |
|
|
Strategy for a step type |
|
|
Strategy knobs |
|
|
Registry step list |
|
(use |
Recommend a pipeline |
|
|
Inspect a shared DAG |
|
|
List shared DAGs |
(framework counts only) |
|
Config guidance for a DAG |
(none) |
|
Auto-select a DAG |
(none) |
|
Load a DAG graph |
(none) |
|
See also¶
Registry & discovery — how the catalog and registry are built.
Step interfaces — the
.step.yamlmodel behindcursus steps.Define a step pack — author a new step the catalog discovers.
CLI reference — every
cursuscommand.Step catalog reference, MCP tools reference, Pipeline catalog reference — generated listings.