An MCP server that lets Claude play Factorio. Claude can walk around, mine resources, place buildings, manage research, and build out a factory — all through natural language.
Fair warning: It's slow, makes spatial reasoning mistakes, and burns through tokens fast. But it works, and it's genuinely fun to watch.
The server connects to a running Factorio instance via RCON and exposes a set of MCP tools that execute Lua commands in the game. Claude uses these tools to perceive the game state and take actions as the player.
- Factorio (tested on 2.0)
- Python 3.10+
- Claude Code (or any MCP-compatible client)
- The server must run on the same machine as Factorio
RCON only works in multiplayer mode. You need to either:
Option A — start from the command line:
factorio --start-server mysave.zip --rcon-port 25575 --rcon-password CHANGE_ME
Option B — start a local multiplayer game and set RCON in config.ini:
[rcon]
rcon-port=25575
rcon-password=CHANGE_METhen start Factorio normally and open a multiplayer (LAN) game.
Option C — configure via the in-game GUI:
Factorio supports a number of hidden configuration options that are not normally shown in the GUI. They can be accessed by holding CTRL + ALT when clicking the "Settings" button in the pause menu, which will cause a new button labeled "The rest" to appear. The RCON port and password settings are in there.
git clone https://github.com/WidAmi/FactoMCP.git
cd FactoMCP
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtThe repo includes a mcp.json.example you can use as a starting point. Copy it to .mcp.json and edit it to match your setup:
{
"mcpServers": {
"factomcp": {
"type": "stdio",
"command": "/path/to/FactoMCP/.venv/bin/python",
"args": ["/path/to/FactoMCP/server.py"],
"env": {
"RCON_HOST": "127.0.0.1",
"RCON_PORT": "25575",
"RCON_PASSWORD": "CHANGE_ME"
}
}
}
}Or set the environment variables manually and run:
RCON_PASSWORD=CHANGE_ME python server.pyFrom the FactoMCP directory, start Claude Code:
claudeClaude Code will automatically pick up .mcp.json. You can verify the server connected with /mcp.
With Factorio running and Claude Code connected, just tell Claude what to do:
Take a look around and find the ore patches
Build a basic iron smelting setup near the iron ore
Set up automated coal mining to keep the furnaces running
| Variable | Default | Description |
|---|---|---|
RCON_HOST |
127.0.0.1 |
Factorio RCON host |
RCON_PORT |
25575 |
Factorio RCON port |
RCON_PASSWORD |
CHANGE_ME |
Factorio RCON password |
FACTORIO_SCRIPT_OUTPUT |
~/Library/Application Support/factorio/script-output |
Path for screenshot output (Mac default) |
| Tool | Description |
|---|---|
get_player_position |
Get the player's current coordinates |
get_player_inventory |
List everything in the player's inventory |
scan_area |
Summarize resources, entities, and structures within a radius |
detail_area |
Detailed tile-by-tile breakdown of a smaller area |
walk_to |
Walk the player to a position using legitimate movement |
| Tool | Description |
|---|---|
mine_resource |
Mine a resource or pick up an entity at a position |
build_entity |
Place an entity from inventory |
build_line |
Place a line of identical entities (belts, poles, etc.) |
rotate_entity |
Change the direction of a placed entity |
load_entity |
Put items from inventory into an entity (fuel, ingredients) |
collect_from_entity |
Take items out of an entity into inventory |
| Tool | Description |
|---|---|
craft |
Queue a crafting recipe |
get_crafting_queue |
See what's currently being crafted |
get_recipes |
List unlocked recipes, with optional name filter |
get_research_status |
Check current research progress |
get_available_technologies |
List technologies that can be researched |
set_research |
Start researching a technology |
set_recipe |
Set the recipe for an assembling machine |
| Tool | Description |
|---|---|
get_entity_status |
Check an entity's status, fuel, inventory, and health |
diagnose_area |
Identify idle or broken entities in an area |
check_power_network |
Inspect the power network around a location |
check_fluid_connections |
Check fluid connections for pipes and fluid entities |
trace_connections |
Trace belt/inserter connections from an entity |
trace_fluid_network |
Trace the fluid network from a pipe or entity |
| Tool | Description |
|---|---|
run_lua |
Execute arbitrary Lua in Factorio (use sparingly) |
stop |
Stop all player actions if something gets stuck |
take_screenshot |
Save a screenshot to Factorio's script-output directory |
get_stats |
Report call count and estimated token usage per tool for this session |
clear_stats |
Reset all usage statistics |
The tools in this server are designed to only do what a normal player could do — walking to locations, mining with the character's reach, placing entities from inventory, crafting recipes, and so on. The goal is to have Claude play the game, not cheat at it.
That said, it may not be perfect. Some actions might inadvertently bypass normal game constraints in ways that aren't immediately obvious. And run_lua in particular executes arbitrary code with no restrictions — it can do basically anything. Use it with that in mind.
- Start by scanning: Ask Claude to
scan_areawith a large radius before doing anything. This gives it the lay of the land. - Coal first: Claude needs coal to fuel burner drills and furnaces. Make sure it sets up a coal supply before building out iron smelting.
- Watch the token usage: Long autonomous runs burn context fast. Break big tasks into phases and check in periodically.
- It makes mistakes: Expect to correct entity placement, inserter directions, and belt routing. The spatial reasoning isn't perfect.