Minecraft Rcon Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Minecraft Rcon Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP server that exposes a Minecraft Java Edition server over RCON as a tool, plus an optional in-game AI chat listener: players type ai <question> in chat and Claude answers in-game, using RCON to read live world state.
It is configured entirely through environment variables, so it is independent of any particular server, world, or Minecraft version.
the response. Use it from any MCP client (Claude Code, VS Code / Copilot, etc.) to inspect or modify the live world.
prefixed with a configurable trigger (ai by default) are answered by Claude via the Anthropic API, with an agentic RCON tool-use loop and a rolling context window. Responses are posted back with /tellraw.
into its context each request and can append to them with a remember tool, so it accumulates knowledge across sessions instead of relying only on the rolling chat window. See Persistent memory.
log path, and memory configuration.
enable-rcon=true in server.properties)pip install git+https://github.com/scotteratigan/minecraft-rcon-mcpOr, for local development / use from a sibling repo:
pip install -e path/to/minecraft-rcon-mcpminecraft-rcon-mcp # console entry point
python -m minecraft_rcon_mcp # equivalentThe server speaks MCP over stdio, so it is normally launched by an MCP client rather than by hand. Example client config (.vscode/mcp.json):
{
"servers": {
"minecraft-rcon": {
"type": "stdio",
"command": "/path/to/.venv/Scripts/python.exe",
"args": ["-m", "minecraft_rcon_mcp"],
"env": {
"RCON_HOST": "localhost",
"RCON_PORT": "25575",
"RCON_PASSWORD": "your-rcon-password",
"LOG_PATH": "/path/to/server/logs/latest.log"
}
}
}
}Provide ANTHROPIC_API_KEY in the launching environment (not in committed files) if you want the in-game AI chat.
| Variable | Default | Purpose |
|---|---|---|
RCON_HOST | localhost | RCON host |
RCON_PORT | 25575 | RCON port |
RCON_PASSWORD | changeme | RCON password (match server.properties) |
LOG_PATH | ./logs/latest.log | Path to the server log to tail. Set this explicitly — the default is relative to the working directory. |
AI_CHAT_ENABLED | 1 | Set 0/false to run a pure RCON tool server (no log tailing, no Anthropic usage). |
AI_PREFIX | ai | Chat trigger prefix (case-insensitive). |
AI_MODEL | claude-sonnet-4-5 | Anthropic model for in-game chat. |
AI_MAX_CONTEXT | 10 | Exchanges retained in the rolling history. |
AI_MAX_TOKENS | 1024 | Max tokens per chat response. |
AI_SYSTEM_PROMPT | (generic built-in) | Replace the entire system prompt. |
AI_SYSTEM_PROMPT_EXTRA | (none) | Append server-specific context (Minecraft version, house rules) to the default prompt. |
AI_MEMORY_ENABLED | 1 | Set 0/false to disable persistent memory (no files read or written). |
SERVER_MEMORY_PATH | ./agent_memory.md | Path to the server-specific memory file (world/player facts). Set this explicitly to a file in your server repo so it is git-tracked there, just like LOG_PATH. |
CAPABILITY_MEMORY_PATH | (packaged `agent_memory/capabilities.md`) | Path to the server-agnostic capability/script memory. Defaults to a file shipped inside this package; override only if you want it elsewhere. |
WORLD_DIR | — | World save folder (the one with level.dat). Required by the file-reading and structure-building scripts run via run_script (it can't be derived over RCON). |
STRUCTURES_DIR | — | Folder of captured .nbt templates. Lets run_script builders/capture refer to structures by bare name (e.g. generate_monument → ocean_monument). |
MINECRAFT_JAR | (auto: `versions//server-.jar`) | Server jar read for the vanilla structure catalog/sizing (generate_structure/generate_piece). Set explicitly when the working dir isn't near the jar. |
ANTHROPIC_API_KEY | — | Required for in-game AI chat. |
The run_command + remember tools are always available. Two more — list_scripts and run_script — dispatch the Python toolbox (structure builders, world queries) without one MCP tool per script; see Scripts & recipes. They're also exposed to the in-game chat agent, so players can ask it to build things.
The in-game AI agent keeps two separate memory stores, both intended to be version-controlled, so it accumulates knowledge across sessions. The split is deliberate — each store lives in a different repo:
| Scope | What goes in it | Where it lives | Written via |
|---|---|---|---|
server | Facts specific to this server, world, or its players — base/build coordinates, player preferences, house rules, world boundaries, ongoing projects. | The consumer (server) repo, at SERVER_MEMORY_PATH. Committed there. | remember(scope="server") |
capability | Server-agnostic knowledge about this MCP — useful command patterns, what a script does, gotchas, techniques that help on any server. | This package, at CAPABILITY_MEMORY_PATH (defaults to agent_memory/capabilities.md). Committed here. | remember(scope="capability") |
How it works:
system prompt under a # Persistent memory heading. Editing a file (by hand or by the agent) takes effect on the next message; no restart needed.
remember tool that takes content and ascope (server | capability) and appends a one-line bullet to the matching file, creating it with a header if absent.
Because the capability store defaults to a path inside this package, the agent writes into it in place. That is committable when the package is installed editable (pip install -e), which is the intended development setup; under a plain wheel install it would write into site-packages instead, so set CAPABILITY_MEMORY_PATH to a writable, tracked location if you deploy that way.
Disable the whole feature with AI_MEMORY_ENABLED=0.
The package bundles server-agnostic tooling split into two layers. They live here (not in any one server repo) because they are reusable capabilities. The aim is a toolbox of small, orthogonal primitives that compose efficiently, plus a few recipes that show how to combine them for common tasks.
Writing one? See CLAUDE.md for the authoring rules (primitive vs. recipe, server-agnostic requirements, shared helpers, quality gates).minecraft_rcon_mcp.scriptsLow-level building blocks, each doing one general thing:
| Primitive | Purpose | Needs world files? |
|---|---|---|
rcon | Shared RCON client + CLI for running any command. | No (RCON only) |
count_entities | Run an entity selector and return the parsed count. | No (RCON only) |
find_block_entities | Scan region files for block entities (spawners, chests…). | Yes |
check_chunk_generated | Whether given coords are in generated chunks. | Yes |
find_unexplored_edges | Nearest ungenerated region frontier to a position. | Yes |
python -m minecraft_rcon_mcp.scripts.rcon "list"
python -m minecraft_rcon_mcp.scripts.count_entities "type=minecraft:cat,distance=..48" --at Steve
python -m minecraft_rcon_mcp.scripts.find_block_entities --x 0 --z 0 --block-id minecraft:chest
python -m minecraft_rcon_mcp.scripts.check_chunk_generated 1216 237 --dimension the_nether
python -m minecraft_rcon_mcp.scripts.find_unexplored_edges 120 45minecraft_rcon_mcp.recipesHigher-level, task-specific tools composed from the primitives (and sometimes coupled to a particular Minecraft version's mechanics). Each is also a worked example of composition:
| Recipe | Composed from | Notes |
|---|---|---|
cat_spawn_check <player> | count_entities | Village cat-spawn gates; thresholds are version-coupled (26.x). |
reset_trial_spawners [player] | find_block_entities + rcon | Finds trial spawners near a player, resets cooldowns. |
python -m minecraft_rcon_mcp.recipes.cat_spawn_check Steve
python -m minecraft_rcon_mcp.recipes.reset_trial_spawnersRCON_HOST / RCON_PORT / RCON_PASSWORD. As a fallback,rcon.py reads rcon.port / rcon.password from a server.properties in the working directory (or SERVER_PROPERTIES).
level.dat / dimensions/). This cannot be derived over RCON (no vanilla command exposes the save path), so set WORLD_DIR, or pass --world-dir.
the_nether / the_end / a namespaced id (mymod:custom) for others. Both vanilla (DIM-1/DIM1) and data-driven (dimensions/<ns>/<name>/) layouts resolve automatically.
The world data itself lives in the server deployment, not in this repo — these tools only carry the logic, and reach the world through WORLD_DIR.This project uses uv for environment and dependency management, Ruff for linting and formatting, and ty for static type checking. The pinned Python version lives in .python-version; uv installs it for you.
uv sync # create .venv and install all deps (incl. dev tools)
uv run pytest # run the test suite
uv run ruff format # auto-format
uv run ruff check # lint (add --fix to auto-fix)
uv run ty check # type-checkMIT — see LICENSE.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.