Atlas / MCP servers / noctedefensor / Ludus

LudusBLOCK

mcp/noctedefensor/ludus
Verdict
BLOCK
Grade
F
Trust score
54 /100
Exposed tools
35 24r · 10w · 1d
Transport
stdio
License
GPL-3.0
Stars
41
01

Overview

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

Model Context Protocol server for managing Ludus lab environments through natural language commands.

Prerequisites

For detailed information, please refer to the wiki

System Requirements

  • Node.js 18.0.0 or higher
  • npm package manager
  • Ludus CLI binary installed and in PATH on host with the mcp-client(ex. claude desktop)
  • Active Ludus server environment
  • Network connectivity to Ludus server via WireGuard VPN or SSH

Ludus Server Access

Ensure you have:

  • Ludus server SSH access credentials
  • Ludus API key (obtain via ludus user apikey command)
  • WireGuard configuration file OR SSH tunnel capabilities (obtain wireguard conf from Ludus CLI)
  • Admin USERID for Ludus server.

Installation

NOTE Installation of the MCP server IS NOT on the Ludus server. It will be installed on a device with an MCP client (ex Claude Desktop) that has access to the Ludus server.

Global Installation (Recommended)

Install the package globally to make the ludus-mcp command available system-wide:

npm install -g ludus-mcp@latest
ludus-mcp --setup-keyring

What happens during installation:

  1. Downloads source code and dependencies
  2. Compiles native dependencies (keytar) for your platform (Windows/Linux/macOS)
  3. Builds TypeScript source to JavaScript (src/ → dist/)
  4. Creates global ludus-mcp command in your PATH

This is a one-time installation process that compiles everything for your specific platform.

From Source (Development)

git clone https://github.com/NocteDefensor/LudusMCP.git
cd LudusMCP
From within LudusMCP directory
npm install    # Installs dependencies and builds automatically
npx ludus-mcp --setup-keyring  # Use npx for local from source installations by running it from within clone/install directory

Installation Requirements

The package includes native depe

Read from source at commit e27fc7543028OBSERVED · 2026-10-08
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-mcp --env LUDUS_API_KEY=${LUDUS_API_KEY} --env LUDUS_SSH_AUTH_METHOD=${LUDUS_SSH_AUTH_METHOD} --env LUDUS_SSH_KEY_PATH=${LUDUS_SSH_KEY_PATH} --env LUDUS_SSH_PASSWORD=${LUDUS_SSH_PASSWORD} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "ludus-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "LUDUS_API_KEY": "${LUDUS_API_KEY}",
        "LUDUS_SSH_AUTH_METHOD": "${LUDUS_SSH_AUTH_METHOD}",
        "LUDUS_SSH_KEY_PATH": "${LUDUS_SSH_KEY_PATH}",
        "LUDUS_SSH_PASSWORD": "${LUDUS_SSH_PASSWORD}"
      }
    }
  }
}
03

Exposed tools (35)

24 read · 10 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
command_intentreadDescribe what you want to accomplish with the CLI command (e.g.,
confirm_destructivewriteSet to true only AFTER user explicitly confirms destructive operations (type: true/false, TRUE/FALSE, or t/f)
create-ludus-rangewriteCreate a complete Ludus cyber range from your requirements. Handles the entire workflow from planning to validation.
deploy_rangewriteDeploy a Ludus range from a configuration file. Creates virtualized training environment. CREDENTIAL SECURITY: Ensure configs use placeholders {{LudusCredName-<user>-<name>}}. DESTRUCTIVE: Always verify before deployment.
destroy_rangedestructiveDESTRUCTIVE: Permanently destroy/stop a range, deleting all VMs and data. This action is irreversible.
execute-ludus-cmdwriteSafely execute Ludus CLI commands with comprehensive safety protocols, tool preference checking, and destructive action confirmation.
get_connection_inforeadGet connection information for accessing a Ludus range. Supports RDP configurations, WireGuard VPN configs, and host file entries. Requires admin privileges to get info for other users.
get_credential_from_userread**MCP TOOL** (NOT a Ludus CLI command) - Prompt user to securely enter a credential via popup dialog and store in OS keyring. IMPORTANT: This is a Ludus MCP server tool, NOT a native Ludus CLI command. Do NOT use
get_range_configreadGet current range configuration from Ludus server or retrieve example configuration.
get_range_statusreadGet the current status and details of a Ludus range. Shows deployment state, VM information, and range configuration. Requires admin privileges to check other users\
get_tagswriteGet the ansible tags available for use with deploy. This shows all available deployment tags that can be used with the deploy_range tool. Requires admin privileges to get tags for other users.
list_all_usersreadList all users in the Ludus system. Requires admin privileges.
list_range_configsreadList and analyze range configurations in directory. Provides validation status and metadata.
list_user_rangesreadList all deployed ranges for a user, showing current status and basic information.
ludus_cli_executewriteCRITICAL: Do NOT include
ludus_docs_searchreadSearch Ludus documentation for configuration help, troubleshooting, and best practices.
ludus_environment_guides_searchreadSearch environment-specific guides and tutorials for different types of cyber ranges.
ludus_helpreadGet help information for Ludus CLI commands and subcommands.
ludus_list_role_collection_schemasreadList all available role and collection schema files (.yaml/.yml) in ~/.ludus-mcp/schemas/. Shows inventory of roles, collections, and templates with file metadata.
ludus_networking_searchreadSearch networking documentation for VPN, network topology, and connectivity guidance.
ludus_powerwritePower management for range VMs (start/stop). Power off operations require confirmation as they may interrupt running processes.
ludus_range_config_check_against_planreadQA checklist tool to verify range configuration against original user requirements and plan. Used during validation phase to ensure all requirements are met.
ludus_range_plannerread**PRIMARY RANGE ORCHESTRATOR** - Use this FIRST for any range creation! Analyzes requirements, researches roles/templates, designs VM architecture, generates structured instructions using existing MCP tools, and estimates resource requirements.
ludus_read_range_config_schemareadDirect access to official Ludus range configuration JSON schema. Provides complete structure, validation rules, and property definitions.
ludus_read_role_collection_schemaread**ROLE SCHEMA REFERENCE** - Reads Ludus role and collection schemas from individual YAML files. Returns comprehensive role data including variables, descriptions, dependencies, and GitHub repositories. Essential for range planning and configuration validation.
ludus_roles_searchreadSearch Ludus roles documentation for specific roles, variables, and usage examples.
range_abortreadAbort an in-progress range deployment, stopping all deployment tasks.
read_range_configreadRead and display range configuration from file or URL. Supports local files and remote URLs.
requirementsreadDescribe what you want to build in natural language (e.g.,
rolesreadOptional: Specify desired Ludus roles/collections to use (e.g.,
save_configwriteWhether to save the generated configuration to file (true/false)
set_range_configwriteApply range configuration to Ludus server. Sets active configuration for deployment.\n\n**WORKING DIRECTORY**: All file paths are relative to ~/.ludus-mcp/range-config-templates/\n\n**PATH USAGE**: Use relative paths only (e.g.,
target_userreadTarget user for admin operations (leave empty for current user operations)
validate_range_configreadValidate range configuration against schema and best practices. Essential before deployment.
write_range_configwriteWrite range configuration to file with automatic validation. Creates directories as needed.
04

Trust audit

BLOCKgrade F · trust 54/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 (5 observation(s))
Network
declared (10 observation(s))
Shell
declared (10 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (16)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/ludusMCP/config.ts:34
const fileConfig = yaml.load(fileContent) as any;
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/tools/insertCredsRangeConfig.ts:329
parsedConfig = yaml.load(injectionResult.content!);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/tools/ludusReadRoleCollectionSchema.ts:81
const parsedYaml = yaml.load(fileContent) as any;
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/tools/rangeConfig.ts:733
parsedConfig = yaml.load(args.content);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/tools/rangeConfig.ts:864
parsedConfig = yaml.load(content);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/ludusMCP/cliWrapper.ts:175
process.env.LUDUS_URL = this.config.ludusUrl || 'https://198.51.100.1:8080';
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/ludusMCP/cliWrapper.ts:185
process.env.LUDUS_URL = 'https://127.0.0.1:8080';
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/ludusMCP/cliWrapper.ts:195
process.env.LUDUS_URL = `https://127.0.0.1:${this.sshTunnelPort}`;
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/ludusMCP/interactiveSetup.ts:277
private async validateApiKey(apiKey: string, ludusUrl: string = 'https://198.51.100.1:8080'): Promise<boolean> {
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/ludusMCP/interactiveSetup.ts:553
config.ludusUrl = process.env.LUDUS_URL || 'https://198.51.100.1:8080';
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
destroy_range
Why it matters. 1 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
.eslintrc.js
.eslintrc.js
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, @types/js-yaml, @types/node, @types/ssh2, ajv, ajv-draft-04, ajv-formats, js-yaml
Why it matters. 15 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:18
- Ludus server SSH access credentials
Why it matters. asks the agent to read credentials
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:182
1. **Load Credentials** - Retrieves stored credentials from OS keyring
Why it matters. asks the agent to read credentials
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:235
- `get_credential_from_user` - Securely collect credentials
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha e27fc7543028full audit observations/trust-audit/mcp-server/noctedefensor__ludus.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-08e27fc7543028BLOCKF54first audit
06

Questions

What tools does Ludus expose?

35 in total: 24 read-only, 10 that write, and 1 that can delete or overwrite (destroy_range). Every one is listed on this page with its risk.

Is Ludus safe to connect to an agent?

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

What credentials does Ludus need?

It reads LUDUS_API_KEY, LUDUS_SSH_AUTH_METHOD, LUDUS_SSH_KEY_PATH, LUDUS_SSH_PASSWORD and SSH_AUTH_SOCK 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 does Ludus run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as ludus-mcp at 1.0.24.

How current is this page?

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

Advertisement