Atlas / MCP servers / lukszi / SatisfactoryMCP

SatisfactoryMCPBLOCK

mcp/lukszi/satisfactorymcp

MCP server and local interactive map for Satisfactory — plan factories, trace logistics, and explore your world, all read straight from your own save files.

Verdict
BLOCK
Grade
F
Trust score
54 /100
Exposed tools
22 18r · 2w · 2d
Transport
—
License
NOASSERTION
Stars
6
01

Overview

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

Ask Claude about your Satisfactory world — and get answers read straight from your own save files. This is an MCP server plus a local web map: the server plans factories with a real optimizer over the game's own recipe data and your actual progress, and the map renders your world in the browser — terrain, factories, belts and pipes, power wiring, floors, crates. Everything runs locally: your saves, the recipe data and the map artwork are all read off this machine, and nothing about your world is sent anywhere.

What you can ask

Phrased however you like — the model picks the tools:

  • *"Plan a factory for 20 Modular Frames per minute using only recipes I've actually unlocked —

what do I build, and how much power will it draw?"*

  • "Which of my pending hard drives should I bank first, and why?"
  • "How healthy is my steel factory right now? Anything idle or starved?"
  • "Where am I standing, and what's the best spot near me for an aluminium setup?"
  • "What's still missing for Phase 3, and which factory is the bottleneck?"
  • "Trace my Reinforced Iron Plates upstream and tell me where the chain is thinnest."
  • *"Compare th
Read from source at commit 877245b5237aOBSERVED · 2026-10-10
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.

claude-code
claude mcp add satisfactory-mcp-web-frontend -- npx -y satisfactory-mcp-web-frontend
claude-desktop
{
  "mcpServers": {
    "satisfactory-mcp-web-frontend": {
      "command": "npx",
      "args": [
        "-y",
        "satisfactory-mcp-web-frontend"
      ]
    }
  }
}
03

Exposed tools (22)

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

ToolRiskDescription
advise_hard_drive_pickreadRank one pending drive
bomreadFlattened bill of materials: total raw and intermediate rates for qty/min of an item.
compare_recipe_optionsreadRank whole ROUTES to make an item by what each actually costs.
cratesreadThe crates lying on the ground: what is in each one and where to walk to get it.
explain_byproductsreadExplain which byproducts stall a plan, and what can legally consume them.
factory_mapreadProposed factories, from power islands and belt topology, plus what is named.
factory_sitesreadBuilt production buildings clustered into sites, largest first.
forget_factorydestructiveDelete a factory label. The machines themselves are untouched.
forget_plandestructiveDelete a saved plan. Nothing in the world is touched, and plan_log can undo it.
list_factoriesreadNamed factories for this world, with how much of each is still standing.
list_pending_hard_drive_choiceswriteThe pending hard-drive choices stored in the save, with rerolls left.
list_regionsreadNamed map regions, optionally only those containing a given resource.
list_worldswriteList save games grouped by world, newest first.
phase_requirementsreadWhat the Space Elevator still wants, live record and deprecated record apart.
power_reportreadGeneration capacity vs machine draw, nameplate AND measured.
power_shardsreadPower Shards held, committed and free, plus what an overclock plan would cost.
recipe_detailreadExact numbers for one recipe: rates, machine, power, unlock source.
search_itemsreadFind items by name. Returns form, energy and sink points.
somersloopsreadSomersloops held, slotted and owned -- the sibling of power_shards.
unlocked_recipesreadWhich recipes this world has. Defaults to alternates, never all 872.
whereamireadWhere the player is standing, and what is around them.
world_summaryreadProgress, power and problems for one world, and the advisories worth a look (adv: ids).
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 & inventoryFAIL
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 (11 observation(s))
Network
declared (7 observation(s))
Shell
declared (4 observation(s))
Dependencies
pinned
Secrets in source
none-found

Findings (25)

HIGHInventory / provenance · inv.suspicious_name · CWE-1104
src/pioneersav/properties/payload.py
payload.py
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/satisfactory_mcp/core/saveio/projection.py:407
loaded: object = pickle.loads(disk.read_bytes())
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tools/mapgen/src/mapgen/cli.py:49
module = importlib.import_module(module_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tools/mapgen/src/mapgen/common.py:57
importlib.import_module(name)
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/satisfactory_mcp/interfaces/web/frontend/scripts/typegen.mjs:18
const url = `http://127.0.0.1:${port}/openapi.json`;
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/satisfactory_mcp/interfaces/web/frontend/vite.config.ts:78
target: process.env.SATISFACTORY_MCP_WEB || "http://127.0.0.1:8712",
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/satisfactory_mcp/interfaces/mcp/tools/gamedata.py:143
body = render.table([*headers, "Δmach", "ΔMW draw", "Δraw"], rows)
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
forget_factory, forget_plan
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.binary · CWE-1104
tests/fixtures/save_body.bin
save_body.bin
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/fixtures/save_body_destroyed.bin
save_body_destroyed.bin
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/fixtures/save_body_v25.bin
save_body_v25.bin
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/fixtures/save_body_v36.bin
save_body_v36.bin
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/fixtures/save_body_v52.bin
save_body_v52.bin
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
tests/core/test_durable_files.py:121
assert pickle.loads(path.read_bytes())["note"] == "a\nb\r\nc"
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/domain/advice/test_rules.py:228
home = getattr(rules, module, None) or importlib.import_module(homes[module])
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/pioneersav/header.py:46
digest = hashlib.md5(data[body_offset:], usedforsecurity=False).digest()
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/satisfactory_mcp/domain/advice/advisory.py:133
key: hashlib.sha1(key.encode("utf-8"), usedforsecurity=False).hexdigest()
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/satisfactory_mcp/domain/planning/progress/stages.py:275
digest = hashlib.sha1(json.dumps(shape).encode("utf-8"), usedforsecurity=False)
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/satisfactory_mcp/core/gameassets/container.py:30
SLICE_DIR = "../../../FactoryGame/Content/FactoryGame/Interface/UI/Assets/MapTest/SlicedMap/"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/satisfactory_mcp/core/gameassets/maparea.py:32
"../../../FactoryGame/Content/FactoryGame/Interface/UI/Minimap/"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/satisfactory_mcp/core/gameassets/maparea.py:38
"../../../FactoryGame/Content/FactoryGame/Interface/UI/Minimap/MapAreaPersistenLevel/"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/satisfactory_mcp/interfaces/web/frontend/src/dash/factories/address.ts:3
import { button, subTabs } from "../../kit/dashkit";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/satisfactory_mcp/interfaces/web/frontend/src/dash/factories/address.ts:4
import { hashFor } from "../../map/map";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:110
The map is at <http://127.0.0.1:8712>, and it follows your saves live as you play. It binds to
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/satisfactory_mcp/interfaces/web/frontend/README.md:51
http://127.0.0.1:5173/api/events` delivers `event: save` frames as the watcher emits them,

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha 877245b5237afull audit observations/trust-audit/mcp-server/lukszi__satisfactorymcp.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-10877245b5237aBLOCKF54first audit
06

Questions

What is the SatisfactoryMCP MCP server?

MCP server and local interactive map for Satisfactory — plan factories, trace logistics, and explore your world, all read straight from your own save files.

What tools does SatisfactoryMCP expose?

22 in total: 18 read-only, 2 that write, and 2 that can delete or overwrite (forget_factory, forget_plan). Every one is listed on this page with its risk.

Is SatisfactoryMCP safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (54/100) and found 2 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: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does SatisfactoryMCP need?

No credential environment variables were found in its source, so it appears to need none.

How current is this page?

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

Advertisement