Atlas / MCP servers / tjnull / Ludus Fast

Ludus FastBLOCK

mcp/tjnull/ludus-fast

A Model Context Protocol (MCP) server for automating Ludus v1 and v2 cyber range environments through AI assistants. 190+ tools for range management, blueprints, groups, templates, scenarios, and SIEM integration.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
200 155r · 57w · 19d
Transport
—
License
MIT
Stars
86
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/tjnull/Ludus-FastMCP) [](https://python.org) [](https://docs.ludus.cloud) [](LICENSE)

A Model Context Protocol (MCP) server for automating Ludus cyber range environments through AI assistants written in Python.

Overview

Ludus FastMCP enables AI-powered management of Ludus cyber ranges through natural language commands. The server exposes 231 tools across 23 modules for range lifecycle management, scenario deployment, template creation, Ansible role management, and security monitoring integration.

Requires Ludus 2.0 or later. This release targets the Ludus 2.x API only, which is what makes blueprints, groups, content sources, VM console access, quotas and diagnostics available. Support for the Ludus 1.x API was removed; pin ludus-fastmcp to a 1.x release if you still run a Ludus 1.x server.

The client covers every endpoint in the Ludus API, validated against a live Ludus 2.3.0 server.

Key Capabilities

Read from source at commit 85139c9df8d7OBSERVED · 2026-10-07
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add ludus-fastmcp --env LUDUS_SSH_KEY_PATH=${LUDUS_SSH_KEY_PATH} --env LUDUS_SSH_PASSWORD=${LUDUS_SSH_PASSWORD} -- uvx ludus-fastmcp
claude-desktop
{
  "mcpServers": {
    "ludus-fastmcp": {
      "command": "uvx",
      "args": [
        "ludus-fastmcp"
      ],
      "env": {
        "LUDUS_SSH_KEY_PATH": "${LUDUS_SSH_KEY_PATH}",
        "LUDUS_SSH_PASSWORD": "${LUDUS_SSH_PASSWORD}"
      }
    }
  }
}
03

Exposed tools (200)

155 read · 57 write · 19 destructive. Blast radius: 19 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
abort_and_remove_rangedestructiveAbort any active deployment and then remove the range.
abort_range_deploymentreadAbort a range deployment.
abort_template_buildreadAbort the running packer build(s).
add_ranges_to_groupwriteAdd ranges to a group.
add_sourcewriteRegister a new content source on the Ludus server.
add_templatewriteAdd a packer template to Ludus by uploading a local directory.
add_userwriteAdd a new user to the Ludus system.
add_users_to_groupwriteAdd users to a group.
allow_testing_domainsreadAllow specific domains or IPs while the range is in testing mode.
apply_adversary_profilewriteApply adversary profile to inject realistic vulnerabilities for red team training.
apply_blueprint_to_rangewriteApply a blueprint to a range.
apply_defender_profilewriteApply defender profile to add monitoring and detection capabilities for blue team training.
assign_range_to_userreadAssign range access to a user.
auto_scalingreadDefine auto-scaling rules based on resource usage.
batch_get_vm_statusreadGet status of multiple VMs in parallel.
batch_power_off_hostsreadPower off multiple VMs in parallel.
batch_power_on_hostsreadPower on multiple VMs in parallel.
batch_remove_snapshotsdestructiveRemove snapshots from multiple VMs in parallel.
batch_rollback_snapshotsreadRollback multiple VMs to a snapshot in parallel.
batch_snapshot_hostswriteCreate snapshots for multiple VMs in parallel.
build_container_based_templatereadBuild a custom container-based template for applications.
build_range_from_descriptionreadBuild a custom range configuration from a natural language description.
build_range_from_scratchreadBuild a completely custom range configuration from scratch.
build_range_from_skeletonreadBuild a complete range configuration starting from a skeleton.
build_templatewriteStart a packer build for one or more VM templates.
bulk_vm_operationsreadPerform bulk operations on multiple VMs.
capture_network_trafficreadCapture network traffic on a VM.
check_role_installedreadCheck if a specific Ansible role is installed.
cleanup_old_rangesdestructiveDelete all ranges EXCEPT those belonging to specified users.
clear_range_accessdestructiveClear all range access permissions.
clone_and_modify_scenariowriteClone an existing scenario and modify it to create a new custom scenario.
clone_rangereadClone the current range to another user.
compliance_checkreadCheck compliance against security framework.
configure_ssh_role_installationreadConfigure SSH access for automatic role installation on Ludus server.
copy_blueprintreadCopy a blueprint under a new ID.
create_blueprintwriteCreate a blueprint from a range configuration you already have.
create_blueprint_from_rangewriteCreate a reusable blueprint from an existing range.
create_container_templatewriteCreate a container-based template.
create_custom_os_templatewriteCreate a custom OS template with specific packages and configuration.
create_custom_range_from_scenariowriteCreate a custom range configuration based on an existing scenario.
create_custom_templatewriteCreate a custom template from scratch.
create_deployment_pipelinewriteCreate a deployment pipeline with multiple stages.
create_groupwriteCreate a new group.
create_kali_weekly_templatewriteCreate a Kali Linux weekly template with automatic latest ISO detection.
create_new_rangewriteCreate a new range.
create_scenario_playbookwriteGenerate a red or blue team playbook for a scenario.
delete_blueprintdestructiveDelete a blueprint.
delete_groupdestructiveDelete a group.
delete_rangedestructiveDelete the entire range.
delete_range_by_userdestructiveDelete a specific user
delete_range_objectdestructiveDelete a range object entirely, removing its configuration too.
delete_ranges_by_statusdestructiveDelete all ranges matching a specific status (requires confirmation).
delete_sourcedestructiveRemove a content source.
delete_templatedestructiveDelete a template.
deny_testing_domainsreadRe-block domains or IPs that were previously allowed in testing mode.
deploy_rangewriteDeploy a range from configuration with optional filters for resuming.
deploy_range_from_blueprintwriteSet up and deploy a whole range from a blueprint in one call.
deploy_scenariowriteDeploy a scenario with optional SIEM integration and customization.
deployment_timelinereadGet deployment timeline with progress tracking.
destroy_vmdestructiveDestroy a specific VM.
diagnose_network_issuesreadDiagnose network connectivity issues.
ensure_scenario_rolesreadEnsure all required roles for a scenario are installed, installing missing ones automatically.
explain_range_design_decisionsreadExplain the design decisions and best practices for a range configuration request.
export_blueprintreadExport a blueprint to a .tar.gz archive on disk.
export_lab_guidereadExport lab guide for training purposes.
export_metricsreadExport metrics data.
export_range_backupreadExport a range backup (configuration and snapshot metadata).
export_range_config_to_yamlreadExport a range configuration to a YAML file for download.
find_range_by_vm_namereadFind which range contains a specific VM by name.
generate_config_from_descriptionreadGenerate a complete Ludus range configuration from natural language description.
generate_range_documentationreadGenerate comprehensive documentation for the range.
get_all_user_quotasreadGet quotas for every user on the server (admin only).
get_ansible_role_varsreadGet variables for an Ansible role (Ludus 2.0 only).
get_attack_path_documentationreadGenerate attack path documentation for an attack technique.
get_auto_shutdownreadGet the auto-shutdown timeout for a range.
get_blueprintreadGet a blueprint
get_blueprint_configreadGet blueprint configuration.
get_common_container_configsreadGet pre-configured container definitions for common applications.
get_common_galaxy_rolesreadGet a list of commonly used Ansible Galaxy roles for Ludus scenarios.
get_common_iso_urlsreadGet common ISO download URLs for popular operating systems.
get_container_configreadGet configuration for a common container.
get_cost_estimationreadGet cost estimation for the range.
get_current_range_config_for_downloadreadGet the current range configuration and prepare it for download.
get_default_quotasreadGet the server-wide default quotas that new users inherit.
get_default_rangereadGet user
get_deployment_metricsreadGet metrics for the current deployment.
get_deployment_statusreadGet current deployment status with detailed information.
get_detection_summaryreadGet detection summary from SIEM.
get_diagnosticsreadGet system diagnostics.
get_group_quotasreadGet the default quotas configured for each group (admin only).
get_licensereadGet license information.
get_network_topologyreadGet network topology visualization data.
get_rangereadGet current user
get_range_accessreadGet range access information.
get_range_ansible_inventoryreadGet Ansible inventory for the range.
get_range_by_userreadGet detailed information about a specific user
get_range_configreadGet range configuration.
get_range_etchostsreadGet /etc/hosts entries for the range.
get_range_log_from_historyreadGet the full contents of one archived range deployment log.
get_range_logsreadGet deployment logs for the range.
get_range_metricsreadGet comprehensive metrics for the range.
get_range_rdpconfigsreadGet RDP configuration files for the range.
get_range_skeletonreadGet a complete range skeleton configuration.
get_range_sshconfigreadGet SSH config for the range.
get_range_tagsreadGet available Ansible tags for the current range.
get_recovery_recommendationreadGet recovery recommendations for failed deployments.
get_required_roles_for_scenarioreadGet the list of required Ansible roles for a specific scenario.
get_resource_quotasreadGet resource quotas and current usage.
get_role_inforeadGet information about a specific role, including installation method and requirements.
get_scenario_configreadGet scenario configuration.
get_scenario_yamlreadGet scenario configuration as YAML.
get_sdn_migration_statusreadGet SDN migration status.
get_server_openapi_specreadFetch the Ludus server
get_siem_agentsreadGet SIEM agents for the range.
get_siem_alertsreadGet SIEM alerts for the range.
get_siem_inforeadGet SIEM information for the range.
get_sourcereadGet details for a single content source.
get_source_catalogwriteGet everything a source publishes, with install state for each item.
get_template_dependenciesreadGet template dependencies.
get_template_log_from_historyreadGet the full contents of one archived template build log.
get_template_logsreadGet the latest packer build logs.
get_template_statusreadGet the status of in-progress packer builds.
get_userreadGet information about a specific user.
get_user_membershipsreadGet current user
get_user_quotasreadGet the resource quotas applied to a user.
get_vm_console_ticketreadGet a console (noVNC) ticket for a VM.
get_vm_console_view_urlreadGet the console WebSocket URL for a ticket from get_vm_console_ticket.
get_vm_skeletonreadGet a specific VM skeleton template configuration.
get_vulnerability_scanreadGet vulnerability scan results for the range.
get_wazuh_inforeadGet Wazuh SIEM information for the range.
get_yaml_examplereadGet a ready-to-use YAML configuration example.
git_syncwriteSync range configurations with a Git repository.
grant_range_accessreadGrant other users access to your range.
handle_adws_recoveryreadHandle Active Directory Web Services (ADWS) recovery for stuck deployments.
health_checkreadCheck health of Ludus MCP server and Ludus API connectivity.
health_checkswriteRun health checks on all VMs in the range.
import_blueprintwriteImport a blueprint from a .tar.gz archive.
import_community_scenariowriteImport a scenario from the community repository.
import_range_backupwriteImport and restore range from backup.
install_blueprintwriteInstall a blueprint
install_from_sourcewriteInstall templates, blueprints, roles or collections from a source.
install_galaxy_rolewriteInstall an Ansible role directly from Ansible Galaxy.
install_rolewriteInstall an Ansible role on the Ludus server via MCP.
install_role_from_urlwriteInstall an Ansible role from a custom Git repository URL.
install_subscription_roleswriteInstall subscription roles (Ludus 2.0 Enterprise only).
jira_integrationreadConfigure JIRA issue creation for failed deployments.
list_accessible_rangesreadList ranges accessible to current user.
list_all_ranges_detailedreadList all ranges with detailed information including identification.
list_available_profilesreadList all available adversary and defender profiles with descriptions.
list_blueprint_access_groupsreadList groups with access to a blueprint.
list_blueprint_access_usersreadList users with access to a blueprint.
list_blueprintsreadList all available blueprints.
list_common_containersreadList common container base images.
list_group_membersreadList group members.
list_group_rangesreadList group ranges.
list_groupsreadList all groups.
list_hostsreadList all hosts in range.
list_installed_rolesreadList all installed Ansible roles on the Ludus server.
list_networksreadList the networks (VLANs) in a range.
list_range_log_historyreadList previous range deployment logs, most recent first.
list_range_skeletonsreadList all available range skeleton templates.
list_range_usersreadList users with access to a range.
list_rangesreadList all ranges (admin only).
list_role_repositoriesreadList all roles that are available from GitHub repositories (directory-based roles).
list_scenariosreadList all available scenarios.
list_snapshotsreadList all snapshots for the range.
list_source_blueprintsreadList blueprints published by a source (GOAD, AD + Elastic, ...).
list_source_collectionsreadList Ansible collections published by a source.
list_source_rolesreadList Ansible roles published by a source.
list_source_templatesreadList packer templates published by a source.
list_sourcesreadList content sources configured on the Ludus server.
list_subscription_rolesreadList available subscription roles (Ludus 2.0 Enterprise only).
list_template_log_historyreadList previous template build logs, most recent first.
list_templatesreadList available templates.
list_usersreadList all users in the Ludus system.
list_vm_skeletonsreadList all available VM skeleton templates.
list_yaml_examplesreadList all available YAML configuration examples.
migrate_sqlite_to_pocketbasereadMigrate from SQLite to PocketBase.
migrate_to_sdnreadMigrate to SDN networking.
monitor_deploymentreadMonitor deployment progress with periodic updates.
move_ansible_role_scopewriteMove Ansible roles between user and global scope (Ludus 2.0 only).
optimize_resource_allocationreadOptimize resource allocation for the range.
optimize_templatereadOptimize a template for better performance.
power_off_rangereadPower off all VMs in the range.
power_on_rangereadPower on all VMs in the range.
preview_profile_changesreadPreview changes that would be made by applying a profile without modifying the config.
preview_scenarioreadPreview a scenario before deployment with detailed information.
provision_oauth2_userreadProvision an OAuth2 user (Ludus 2.0 only).
publish_scenariowritePublish a scenario to the community repository.
quick_statusreadGet one-line deployment status with emoji indicators.
range_access_logsreadGet range access logs.
regenerate_user_apikeyreadDESTRUCTIVE: issue a NEW API key for a user, invalidating the old one.
remove_ranges_from_groupdestructiveRemove ranges from a group.
remove_snapshotdestructiveDelete a snapshot from one or more VMs.
remove_userdestructiveRemove a user from the Ludus system.
remove_users_from_groupdestructiveRemove users from a group.
revoke_range_accessdestructiveRevoke range access from a user.
revoke_range_from_userdestructiveRevoke range access from a user.
rollback_snapshotreadRoll one or more VMs back to a snapshot.
rotate_credentialswriteSuggest new credentials for VMs in the range. DOES NOT APPLY THEM.
04

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (8 observation(s))
Network
declared (15 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
none-found

Findings (22)

HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
ludus_mcp/utils/error_formatter.py:239
"- For self-signed certs: Set LUDUS_SSL_VERIFY=false",
Why it matters. certificate verification is disabled
Fix. leave verification on
MEDIUMInsecure crypto · crypto.weak_random · CWE-327, CWE-338
ludus_mcp/scenarios/randomizer.py:184
pattern = random.choice(PASSWORD_PATTERNS)
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
ludus_mcp/schemas/profiles.py:34
EXFILTRATION = "exfiltration"
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
ludus_mcp/server/handlers/profile_transformer.py:248
"exfiltration": [
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
ludus_mcp/server/handlers/profile_transformer.py:620
"category": "Exfiltration",
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
ludus_mcp/server/handlers/profile_transformer.py:661
"focus_areas": ["initial_access", "privilege_escalation", "exfiltration"],
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
ludus_mcp/server/handlers/profile_transformer.py:673
"focus_areas": ["credential_access", "lateral_movement", "exfiltration"],
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
abort_and_remove_range, batch_remove_snapshots, cleanup_old_ranges, clear_range_access, delete_blueprint, delete_group, delete_range, delete_range_by_user, delete_range_object, delete_ranges_by_status
Why it matters. 19 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
ludus_mcp/server/handlers/automation_orchestration.py:28
pipeline_id = hashlib.md5(f"{pipeline_name}{datetime.now()}".encode()).hexdigest()[:8]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
ludus_mcp/server/handlers/automation_orchestration.py:83
task_id = hashlib.md5(f"{task_type}{schedule}{datetime.now()}".encode()).hexdigest()[:8]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
ludus_mcp/server/handlers/backup.py:54
"schedule_id": hashlib.md5(f"{vm_name}{schedule}{datetime.now()}".encode()).hexdigest()[:8],
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
ludus_mcp/server/handlers/backup.py:119
"clone_id": hashlib.md5(f"{datetime.now()}".encode()).hexdigest()[:8],
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
ludus_mcp/server/handlers/backup.py:190
"backup_id": hashlib.md5(f"{datetime.now()}".encode()).hexdigest(),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/unit/test_health_check.py:28
"[FATAL] Get \"https://192.0.2.99:8080/api/v2/\": dial tcp 192.0.2.99:8080: "
LOWNetwork egress · net.tls_off · CWE-200, CWE-319
tests/unit/test_client_auth.py:13
settings.ludus_ssl_verify = False
Why it matters. certificate verification is disabled
Fix. leave verification on
LOWNetwork egress · net.tls_off · CWE-200, CWE-319
tests/unit/test_client_blueprints.py:13
settings.ludus_ssl_verify = False
Why it matters. certificate verification is disabled
Fix. leave verification on
LOWNetwork egress · net.tls_off · CWE-200, CWE-319
tests/unit/test_client_v2_compat.py:13
settings.ludus_ssl_verify = False
Why it matters. certificate verification is disabled
Fix. leave verification on
LOWNetwork egress · net.tls_off · CWE-200, CWE-319
tests/unit/test_client_v2_new.py:13
settings.ludus_ssl_verify = False
Why it matters. certificate verification is disabled
Fix. leave verification on
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
ludus_mcp/server/handlers/collaboration.py:150
decoded = base64.b64decode(scenario_source)
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
docs/safety.md:248
4. **Admin misuse** - Admins have elevated privileges
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
docs/troubleshooting.md:313
3. Contact Ludus administrator for elevated access

Gates applied: no_behavioural_pass.

Audited 2026-10-07 · audit v0.4.1 · source sha 85139c9df8d7full audit observations/trust-audit/mcp-server/tjnull__ludus-fast.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-0785139c9df8d7BLOCKD69first audit
06

Questions

What is the Ludus Fast MCP server?

A Model Context Protocol (MCP) server for automating Ludus v1 and v2 cyber range environments through AI assistants. 190+ tools for range management, blueprints, groups, templates, scenarios, and SIEM integration.

What tools does Ludus Fast expose?

200 in total: 155 read-only, 57 that write, and 19 that can delete or overwrite (abort_and_remove_range, batch_remove_snapshots, cleanup_old_ranges, clear_range_access, delete_blueprint). Every one is listed on this page with its risk.

Is Ludus Fast safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 19 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does Ludus Fast need?

It reads LUDUS_SSH_KEY_PATH and LUDUS_SSH_PASSWORD from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

The grade is for one exact copy of the source (85139c9df8d7), read on 2026-10-07. The repository is watched and re-audited when it changes.

Advertisement