# loenn-mcp (mcpb · loenn-mcp-7.2.0.mcpb)

Celeste map editor for AI agents: read, edit, validate, preview and generate .bin maps.

- Trust score: 42/100 (low)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- mcpb · `loenn-mcp-7.2.0.mcpb`: 42/100 (this document), [markdown](https://verifymcp.io/servers/magedeline-loenn-mcp/loenn-mcp.md), [page](https://verifymcp.io/servers/magedeline-loenn-mcp/loenn-mcp)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/Magedeline/loenn-mcp/releases/download/v7.2.0/loenn-mcp-7.2.0.mcpb`
- Version: `7.2.0`
- Transport: `stdio`
- SHA-256: `99aa5f3cd18d0bcc9fc9016683aa7a10b29beaa868161cb40f45f640fe2a90f5`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 12/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs were checked across the 15 of 15 dependencies we could resolve, so this covers what we could see, not the whole tree.
  - Install-script risk not yet assessed.
  - 1 of 15 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 13 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 7885 tokens (~88/item across 89 items; 89 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 99% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "remove_entity" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 90 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the loenn-mcp server?

loenn-mcp ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 99aa5f3cd18d0bcc9fc9016683aa7a10b29beaa868161cb40f45f640fe2a90f5; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/Magedeline/loenn-mcp/releases/download/v7.2.0/loenn-mcp-7.2.0.mcpb`
- SHA-256: `99aa5f3cd18d0bcc9fc9016683aa7a10b29beaa868161cb40f45f640fe2a90f5`

### Verify on macOS / Linux

```bash
echo "99aa5f3cd18d0bcc9fc9016683aa7a10b29beaa868161cb40f45f640fe2a90f5  loenn-mcp-7.2.0.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\loenn-mcp-7.2.0.mcpb).Hash -eq "99aa5f3cd18d0bcc9fc9016683aa7a10b29beaa868161cb40f45f640fe2a90f5"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-23 (score 42)

First indexed and scored.

## MCP tools (89)

### `list_maps` (~35 tokens)

List all .bin map files in the project.

Input parameters:

- `subdir` (string): Subdirectory to search (default: "Maps")

Output parameters:

- `result` (string)

### `read_map_overview` (~45 tokens)

Parse a .bin map file and return a summary of rooms and structure.

Input parameters:

- `map_path` (string, required): Path to the .bin file (relative to workspace or absolute)

Output parameters:

- `result` (string)

### `read_room` (~54 tokens)

Get detailed data for a specific room: tiles, entities, triggers.

Input parameters:

- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name (with or without 'lvl_' prefix)

Output parameters:

- `result` (string)

### `get_room_tiles` (~65 tokens)

Get the complete tile grid for a room as text.

Input parameters:

- `layer` (string): "fg" for foreground (solids), "bg" for background
- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name

Output parameters:

- `result` (string)

### `add_entity` (~149 tokens)

Add an entity to a room and save the map.

Input parameters:

- `entity_id` (integer): Entity ID (-1 to auto-assign)
- `entity_name` (string, required): Entity type (e.g. "player", "MaggyHelper/KirbyBoss")
- `height` (integer): Entity height (0 if inapplicable)
- `map_path` (string, required): Path to the .bin file
- `properties` (string): JSON object string of extra properties
- `room_name` (string, required): Room name
- `width` (integer): Entity width (0 if inapplicable)
- `x` (integer, required): X position in pixels
- `y` (integer, required): Y position in pixels

Output parameters:

- `result` (string)

### `remove_entity` (~54 tokens)

Remove an entity from a room by its ID.

Input parameters:

- `entity_id` (integer, required): Entity ID to remove
- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name

Output parameters:

- `result` (string)

### `add_trigger` (~208 tokens)

Add a trigger to a room and save the map.

Input parameters:

- `height` (integer): Trigger height in pixels (default 16)
- `map_path` (string, required): Path to the .bin file
- `nodes` (string): JSON array of {"x": int, "y": int} objects for triggers that need path/target nodes (e.g. cameraTargetTrigger). Default "[]".
- `properties` (string): JSON object string of extra properties (e.g. '{"dialog_id": "MAP_INTRO"}')
- `room_name` (string, required): Room name
- `trigger_id` (integer): Trigger ID (-1 to auto-assign)
- `trigger_name` (string, required): Trigger type (e.g. "everest/dialogTrigger", "2.5DHelper/StarterFlagTrigger")
- `width` (integer): Trigger width in pixels (default 16)
- `x` (integer, required): X position in pixels
- `y` (integer, required): Y position in pixels

Output parameters:

- `result` (string)

### `remove_trigger` (~54 tokens)

Remove a trigger from a room by its ID.

Input parameters:

- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name
- `trigger_id` (integer, required): Trigger ID to remove

Output parameters:

- `result` (string)

### `set_room_tiles` (~92 tokens)

Set tile data for a room. Each row is a line of characters ('0'=air).

Input parameters:

- `layer` (string): "fg" for foreground (solids), "bg" for background
- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name
- `tiles` (string, required): Tile data (newline-separated rows, 1 char per tile)

Output parameters:

- `result` (string)

### `add_room` (~131 tokens)

Add a new empty room to a map.

Input parameters:

- `dark` (boolean): Whether the room is dark
- `height` (integer): Room height in pixels (multiple of 8)
- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name (prefixed with 'lvl_' if needed)
- `space` (boolean): Whether the room has space physics
- `width` (integer): Room width in pixels (multiple of 8)
- `x` (integer): Room X position in pixels
- `y` (integer): Room Y position in pixels

Output parameters:

- `result` (string)

### `remove_room` (~41 tokens)

Remove a room from a map.

Input parameters:

- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name to remove

Output parameters:

- `result` (string)

### `create_map` (~59 tokens)

Create a new empty Celeste .bin map file.

Input parameters:

- `map_path` (string, required): Path for the new file (relative to workspace)
- `package_name` (string): Map package name (e.g. "Maggy/PCG/MyMap")

Output parameters:

- `result` (string)

### `list_stylegrounds` (~37 tokens)

List all stylegrounds (foreground + background effects) in a map.

Input parameters:

- `map_path` (string, required): Path to the .bin file

Output parameters:

- `result` (string)

### `add_styleground` (~159 tokens)

Add a styleground effect to a map.

Input parameters:

- `effect_name` (string, required): Effect type (e.g. "parallax", "2.5DHelper/VoidBg", "WhiteholeBg", "apply" for a group element)
- `index` (integer): Position to insert at (-1 appends to the end)
- `layer` (string): "bg" / "background" / "backgrounds" (default), or "fg" / "foreground" / "foregrounds"
- `map_path` (string, required): Path to the .bin file
- `properties` (string): JSON object of effect properties (e.g. '{"texture": "bgs/01/bg", "only": "lvl_a-01"}')

Output parameters:

- `result` (string)

### `remove_styleground` (~76 tokens)

Remove a styleground from a map by its index in the layer.

Input parameters:

- `index` (integer, required): 0-based index of the styleground in that layer
- `layer` (string, required): "fg"/"foregrounds" or "bg"/"backgrounds"
- `map_path` (string, required): Path to the .bin file

Output parameters:

- `result` (string)

### `update_styleground` (~87 tokens)

Merge properties into an existing styleground without replacing it.

Input parameters:

- `index` (integer, required): 0-based index of the styleground in that layer
- `layer` (string, required): "fg"/"foregrounds" or "bg"/"backgrounds"
- `map_path` (string, required): Path to the .bin file
- `properties` (string, required): JSON object of properties to merge in

Output parameters:

- `result` (string)

### `list_entity_definitions` (~34 tokens)

List available Lönn entity definitions from the project.

Input parameters:

- `filter_text` (string): Optional text to filter filenames

Output parameters:

- `result` (string)

### `get_entity_definition` (~66 tokens)

Read a Lönn entity Lua definition and extract its properties.

Input parameters:

- `entity_file` (string, required): Entity name as placed in maps (e.g. "CEL/KrackoBoss") or a filename (e.g. "kirbyBoss" or "kirbyBoss.lua")

Output parameters:

- `result` (string)

### `list_trigger_definitions` (~31 tokens)

List available Lönn trigger definitions.

Input parameters:

- `filter_text` (string): Optional text to filter filenames

Output parameters:

- `result` (string)

### `list_effect_definitions` (~31 tokens)

List available Lönn effect definitions.

Input parameters:

- `filter_text` (string): Optional text to filter filenames

Output parameters:

- `result` (string)

### `find_missing_definitions` (~42 tokens)

List namespaced entities and triggers in a map that no installed Lönn plugin defines.

Input parameters:

- `map_path` (string, required): Path to the .bin file.

Output parameters:

- `result` (string)

### `audit_plugin_coverage` (~69 tokens)

Compare the mod's C# [CustomEntity] names with its Lönn plugin definitions.

Input parameters:

- `prefix` (string): Only report names starting with this (e.g. "CEL/").
- `source_dir` (string): C# source folder relative to the workspace (default "Source").

Output parameters:

- `result` (string)

### `validate_audio` (~34 tokens)

Check every audio event a map references against the sound banks.

Input parameters:

- `map_path` (string, required): Path to the .bin file.

Output parameters:

- `result` (string)

### `analyze_map` (~30 tokens)

Get detailed statistics about a map file.

Input parameters:

- `map_path` (string, required): Path to the .bin file

Output parameters:

- `result` (string)

### `preview_map_section` (~112 tokens)

Generate an ASCII preview of a map section, like a Lönn mini-map.

Input parameters:

- `center_room` (string): Center the view on this room name
- `cols` (integer): Terminal width for the preview (default 140)
- `map_path` (string, required): Path to the .bin file
- `prefix` (string): Only show rooms whose name starts with this (e.g. "g-", "h-")
- `rows` (integer): Terminal height for the preview (default 60)

Output parameters:

- `result` (string)

### `render_map_html` (~212 tokens)

Render an interactive HTML map preview with zoom, pan, search, and detail panel.

Input parameters:

- `detail` (boolean): Draw each room's solid/background tiles and entity markers (hazards red, collectibles gold, spawns green, refills light green). False draws room boxes only.
- `map_path` (string, required): Path to a .bin file, or to a typed JSON dump made by map_to_json
- `output_file` (string): Output HTML filename (default: map_preview.html in Temp/)
- `overlay` (string): Authoring JSON (inline, or a path to a .json file) to preview as a merge: it is applied in memory only, and every object it would add is ringed in magenta (red when a placement check failed). Nothing…
- `prefix` (string): Only show rooms matching this prefix (e.g. "g-", "w-"); works whether or not the map's room names carry 'lvl_'

Output parameters:

- `result` (string)

### `validate_room` (~49 tokens)

Check a room for common playability problems.

Input parameters:

- `map_path` (string, required): Path to the .bin file.
- `room_name` (string, required): Room name (with or without 'lvl_' prefix).

Output parameters:

- `result` (string)

### `read_map_metadata` (~36 tokens)

Read high-level metadata from a map without listing all room contents.

Input parameters:

- `map_path` (string, required): Path to the .bin file.

Output parameters:

- `result` (string)

### `search_entities` (~126 tokens)

Search for entities across all rooms (or a specific room) by type and/or position.

Input parameters:

- `entity_type` (string): Filter by entity type name (substring match). Empty = all.
- `map_path` (string, required): Path to the .bin file.
- `max_x` (integer): Maximum X position filter.
- `max_y` (integer): Maximum Y position filter.
- `min_x` (integer): Minimum X position filter.
- `min_y` (integer): Minimum Y position filter.
- `room_name` (string): Search only in this room. Empty = all rooms.

Output parameters:

- `result` (string)

### `search_triggers` (~69 tokens)

Search for triggers across all rooms by type.

Input parameters:

- `map_path` (string, required): Path to the .bin file.
- `room_name` (string): Search only in this room. Empty = all rooms.
- `trigger_type` (string): Filter by trigger type (substring match). Empty = all.

Output parameters:

- `result` (string)

### `compare_rooms` (~55 tokens)

Compare two rooms in the same map side-by-side.

Input parameters:

- `map_path` (string, required): Path to the .bin file.
- `room_a` (string, required): First room name.
- `room_b` (string, required): Second room name.

Output parameters:

- `result` (string)

### `update_entity` (~93 tokens)

Update properties of an existing entity by ID.

Input parameters:

- `entity_id` (integer, required): ID of the entity to update.
- `map_path` (string, required): Path to the .bin file.
- `properties_json` (string, required): JSON object of properties to set/update.              Example: '{"x": 100, "y": 50, "width": 16}'
- `room_name` (string, required): Room containing the entity.

Output parameters:

- `result` (string)

### `move_entity` (~76 tokens)

Move an entity to a new position.

Input parameters:

- `entity_id` (integer, required): ID of the entity to move.
- `map_path` (string, required): Path to the .bin file.
- `room_name` (string, required): Room containing the entity.
- `x` (integer, required): New X position.
- `y` (integer, required): New Y position.

Output parameters:

- `result` (string)

### `update_room` (~82 tokens)

Update room-level properties (music, dark, wind, etc.).

Input parameters:

- `map_path` (string, required): Path to the .bin file.
- `properties_json` (string, required): JSON object of properties to update.              Example: '{"dark": true, "windPattern": "Left"}'
- `room_name` (string, required): Room name (with or without lvl_ prefix).

Output parameters:

- `result` (string)

### `clone_room` (~100 tokens)

Clone an existing room to a new name and position.

Input parameters:

- `map_path` (string, required): Path to the .bin file.
- `new_name` (string, required): Name for the cloned room.
- `source_room` (string, required): Name of the room to clone.
- `x` (integer): X position for the clone (-1 = place to the right of source).
- `y` (integer): Y position for the clone (-1 = same Y as source).

Output parameters:

- `result` (string)

### `batch_add_entities` (~119 tokens)

Add multiple entities to a room in one call.

Input parameters:

- `entities_json` (string, required): JSON array of entity objects.            Each must have "__name". Optional: x, y, width, height, etc.            IDs are auto-assigned.            Example: '[{"__name":"strawberry","x":100,"y":50},…
- `map_path` (string, required): Path to the .bin file.
- `room_name` (string, required): Target room name.

Output parameters:

- `result` (string)

### `list_decals` (~64 tokens)

List all decals in a room (foreground or background).

Input parameters:

- `layer` (string): "fg" for foreground decals, "bg" for background decals.
- `map_path` (string, required): Path to the .bin file.
- `room_name` (string, required): Room name.

Output parameters:

- `result` (string)

### `add_decal` (~132 tokens)

Add a decal to a room.

Input parameters:

- `layer` (string): "fg" or "bg".
- `map_path` (string, required): Path to the .bin file.
- `room_name` (string, required): Target room.
- `scale_x` (number): Horizontal scale (default 1.0).
- `scale_y` (number): Vertical scale (default 1.0).
- `texture` (string, required): Decal texture path (e.g. "decals/1-forsakencity/flag_a00").
- `x` (integer, required): X position.
- `y` (integer, required): Y position.

Output parameters:

- `result` (string)

### `remove_decal` (~68 tokens)

Remove a decal by index.

Input parameters:

- `index` (integer, required): Decal index (from list_decals output).
- `layer` (string): "fg" or "bg".
- `map_path` (string, required): Path to the .bin file.
- `room_name` (string, required): Room name.

Output parameters:

- `result` (string)

### `analyze_difficulty` (~57 tokens)

Estimate room or map difficulty from hazard density, nav aids, and tile coverage.

Input parameters:

- `map_path` (string, required): Path to the .bin file.
- `room_name` (string): Specific room to analyze. Empty = analyze all rooms.

Output parameters:

- `result` (string)

### `analyze_room_connectivity` (~38 tokens)

Analyze room adjacency graph showing isolated rooms, dead ends, and hubs.

Input parameters:

- `map_path` (string, required): Path to the .bin file.

Output parameters:

- `result` (string)

### `get_mod_info` (~17 tokens)

Get information about the current mod project.

Output parameters:

- `result` (string)

### `validate_map` (~59 tokens)

Validate an entire map for playability issues.

Input parameters:

- `auto_fix` (boolean): If True, automatically fix issues where possible       (adds spawns, floor tiles, clamps entities).
- `map_path` (string, required): Path to the .bin file.

Output parameters:

- `result` (string)

### `get_trigger_definition` (~44 tokens)

Read the source of a Lönn trigger definition .lua file.

Input parameters:

- `trigger_name` (string, required): Name of the trigger (searches in Loenn/triggers/).

Output parameters:

- `result` (string)

### `get_effect_definition` (~44 tokens)

Read the source of a Lönn effect definition .lua file.

Input parameters:

- `effect_name` (string, required): Name of the effect (searches in Loenn/effects/).

Output parameters:

- `result` (string)

### `export_room_json` (~63 tokens)

Export a room as a JSON file for external editing or sharing.

Input parameters:

- `map_path` (string, required): Path to the .bin file.
- `output_path` (string): Output JSON path (default: auto-generated).
- `room_name` (string, required): Room to export.

Output parameters:

- `result` (string)

### `import_room_json` (~111 tokens)

Import a room from a JSON file into a map.

Input parameters:

- `json_path` (string, required): Path to the JSON file (exported by export_room_json).
- `map_path` (string, required): Path to the .bin file to import into.
- `new_name` (string): Optional new name for the room (overrides name in JSON).
- `x` (integer): X position override (-1 = use position from JSON).
- `y` (integer): Y position override (-1 = use position from JSON).

Output parameters:

- `result` (string)

### `batch_validate_and_fix` (~51 tokens)

Validate all rooms in a map and optionally auto-fix issues.

Input parameters:

- `auto_fix` (boolean): If True, apply automatic fixes.
- `map_path` (string, required): Path to the .bin file.

Output parameters:

- `result` (string)

### `get_room_settings` (~59 tokens)

Get all editable settings for a room (music, physics, wind, camera, flags).

Input parameters:

- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name (with or without 'lvl_' prefix)

Output parameters:

- `result` (string)

### `update_room_settings` (~91 tokens)

Update room settings (music, physics, wind, camera, flags) by merging a JSON object.

Input parameters:

- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name
- `settings` (string, required): JSON object of key/value pairs to update,       e.g. '{"music": "event:/music/lvl2/beginning", "dark": true}'

Output parameters:

- `result` (string)

### `rename_room` (~59 tokens)

Rename a room in a map.

Input parameters:

- `map_path` (string, required): Path to the .bin file
- `new_name` (string, required): New room name (lvl_ prefix added automatically if missing)
- `room_name` (string, required): Current room name

Output parameters:

- `result` (string)

### `move_room` (~66 tokens)

Move a room to a new world-space position.

Input parameters:

- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name
- `x` (integer, required): New X position in pixels
- `y` (integer, required): New Y position in pixels

Output parameters:

- `result` (string)

### `resize_room` (~93 tokens)

Resize a room (snaps to 8-pixel grid, preserves tile data).

Input parameters:

- `height` (integer, required): New height in pixels (must be multiple of 8, min 40)
- `map_path` (string, required): Path to the .bin file
- `room_name` (string, required): Room name
- `width` (integer, required): New width in pixels (must be multiple of 8, min 40)

Output parameters:

- `result` (string)

### `get_map_metadata` (~39 tokens)

Read the map-level metadata block (Everest/celeste.yaml meta settings).

Input parameters:

- `map_path` (string, required): Path to the .bin file

Output parameters:

- `result` (string)

### `set_map_metadata` (~133 tokens)

Set map-level metadata properties (Everest meta block).

Input parameters:

- `map_path` (string, required): Path to the .bin file
- `settings` (string, required): JSON object of meta key/value pairs to set,       e.g. '{"Wipe": "Mountain", "Dreaming": true}'
- `subpath` (string): Optional '/'-separated path to a nested element under meta      to target instead of meta itself, e.g. "mode/audiostate"      for '{"Music": "event:/music/DZ/lvl2/beginning"}'. Missing      intermedi…

Output parameters:

- `result` (string)

### `replace_audio_event` (~113 tokens)

Find and replace an FMOD audio event path anywhere in a map.

Input parameters:

- `dry_run` (boolean): If true, report what would change without writing the file
- `map_path` (string, required): Path to the .bin file
- `new_event` (string, required): Replacement substring, e.g. "DZ"
- `old_event` (string, required): Substring to find, e.g. "pusheen" or a full event path         like "event:/music/pusheen/lvl2/beginning"

Output parameters:

- `result` (string)

### `get_map_dependencies` (~39 tokens)

Read the mod dependencies list from a map's everest.yaml or meta node.

Input parameters:

- `map_path` (string, required): Path to the .bin file

Output parameters:

- `result` (string)

### `set_map_dependencies` (~112 tokens)

Write or update the mod dependency list in the map's everest.yaml.

Input parameters:

- `dependencies` (string, required): JSON array of dependency objects, each with "Name" and           "Version" fields. Use "Celeste" and "Everest" as base deps.           Example: '[{"Name":"Everest","Version":"1.0.0"},…
- `map_path` (string, required): Path to the .bin file

Output parameters:

- `result` (string)

### `map_to_json` (~76 tokens)

Convert a .bin map to typed JSON that converts back byte-identical.

Input parameters:

- `indent` (integer): JSON indent; 0 for the most compact file
- `map_path` (string, required): Path to the .bin file
- `output_path` (string): Where to write the JSON (default: Export/<map>.json)

Output parameters:

- `result` (string)

### `json_to_map` (~66 tokens)

Convert typed JSON (from map_to_json, possibly edited) back to a .bin map.

Input parameters:

- `json_path` (string, required): Typed JSON file
- `map_path` (string, required): Output .bin path
- `overwrite` (boolean): Must be true to replace an existing map

Output parameters:

- `result` (string)

### `check_authoring_json` (~102 tokens)

Resolve authoring JSON without a map: show each object with its defaults filled in from the Lönn definitions, and flag unknown names.

Input parameters:

- `authoring_json` (string, required): Inline JSON, or a path to a .json file. Format: {"rooms": [{"room": "a-05", "entities": [{"name": "strawberry", "x": 120, "y": 64}],             "triggers": [...]}]}

Output parameters:

- `result` (string)

### `merge_json_into_map` (~131 tokens)

Add entities, triggers and rooms from authoring JSON to an existing map.

Input parameters:

- `allow_problems` (boolean): Write even when placement checks fail
- `allow_unknown` (boolean): Place objects with no Lönn definition anyway
- `authoring_json` (string, required): Inline JSON or a path to a .json file (see check_authoring_json)
- `dry_run` (boolean): Only show the diff (default). Set false to write.
- `map_path` (string, required): Path to the .bin file
- `preview` (boolean): Also render an HTML preview with the additions highlighted

Output parameters:

- `result` (string)

### `run_author_script` (~126 tokens)

Run a JavaScript authoring script (js/ package, lucid-dream style) and use its output.

Input parameters:

- `allow_problems` (boolean): See merge_json_into_map
- `allow_unknown` (boolean): See merge_json_into_map
- `dry_run` (boolean): Only show the diff when merging (default)
- `map_path` (string): Map to merge into (optional)
- `output_json` (string): Where to save the generated authoring JSON (default: Export/<script>.authoring.json)
- `script_path` (string, required): The .js file

Output parameters:

- `result` (string)

### `game_status` (~24 tokens)

Where the running game is: map SID, side, room and player position.

Output parameters:

- `result` (string)

### `game_reload_map` (~55 tokens)

Make the running game re-read a map after it was edited on disk.

Input parameters:

- `map_path` (string, required): Path to the .bin file (relative to the workspace).
- `side` (string): A, B or C.

Output parameters:

- `result` (string)

### `game_teleport` (~83 tokens)

Load a room of a map in the running game (a fresh debug session).

Input parameters:

- `map_path` (string, required): Path to the .bin file (relative to the workspace).
- `room` (string, required): Room name, with or without 'lvl_'.
- `side` (string): A, B or C.
- `x`
- `y`

Output parameters:

- `result` (string)

### `game_play_tas` (~99 tokens)

Play CelesteTAS inputs from a room's spawn and report where the player ended up.

Input parameters:

- `inputs` (string, required): TAS input lines.
- `intro_frames` (integer): Frames to wait after loading before inputs act.
- `map_path` (string, required): Path to the .bin file (relative to the workspace).
- `room` (string, required): Room to start in.
- `timeout_s` (number): Give up after this many seconds.

Output parameters:

- `result` (string)

### `game_log` (~68 tokens)

Recent lines of the game's log.txt: errors, warnings and level loads.

Input parameters:

- `lines` (integer): How many trailing log lines to scan.
- `only_problems` (boolean): Keep only errors, warnings about missing events or textures, failed map loads and level-load lines (default True).

Output parameters:

- `result` (string)

### `map_copy` (~67 tokens)

Copy a map to a working copy so edits never touch the original. Default target: Maps/<mod>/wip/<name>.copy.bin.

Input parameters:

- `dest` (string): Target .bin in the workspace; must not exist yet
- `map_path` (string, required): .bin to copy

Output parameters:

- `result` (string)

### `map_commit` (~132 tokens)

Apply a working copy to the real map: whole file, or only the listed rooms. Dry run shows the diff first.

Input parameters:

- `allow_issues` (boolean): Write even if the committed rooms fail validation (e.g. no player spawn)
- `dry_run` (boolean): Only show the diff and checks (default). Set false to write.
- `rooms` (string): Comma-separated room names to take from the copy; empty = replace the whole map
- `target_map` (string, required): The map to update (a timestamped backup is kept)
- `work_map` (string, required): The edited copy

Output parameters:

- `result` (string)

### `map_backups` (~45 tokens)

List the timestamped backups of a map, newest first.

Input parameters:

- `limit` (integer): Maximum entries
- `map_path` (string, required): The .bin whose backups to list

Output parameters:

- `result` (string)

### `map_restore` (~71 tokens)

Restore a map from one of its backups (the current file is backed up first).

Input parameters:

- `backup` (string): Backup file name from map_backups, or "latest"
- `dry_run` (boolean): Only show what would change (default)
- `map_path` (string, required): The .bin to restore

Output parameters:

- `result` (string)

### `map_diff` (~92 tokens)

Semantic diff of two maps: rooms, geometry, fg/bg tiles, entities, triggers, decals, stylegrounds, meta.

Input parameters:

- `limit` (integer): Maximum output lines
- `map_a` (string, required): The older map (or the map to compare with its latest backup when map_b is empty)
- `map_b` (string): The newer map; empty = compare map_a's latest backup -> map_a

Output parameters:

- `result` (string)

### `check_assets` (~59 tokens)

Check that a map only uses things that exist: entity/trigger names with a Lönn definition, decal and parallax textures.

Input parameters:

- `limit` (integer): Maximum findings to list
- `map_path` (string, required): The .bin to check

Output parameters:

- `result` (string)

### `check_sprites_xml` (~71 tokens)

Check a Sprites.xml: it parses, ids are unique, and every Anim/Loop has frames in the atlas. Check this first when a sprite does not show in game.

Input parameters:

- `limit` (integer): Maximum findings to list
- `xml_path` (string): Sprites.xml in the workspace

Output parameters:

- `result` (string)

### `editor_open` (~114 tokens)

Open a map in Lönn (or Rysy), optionally on a room. MCP writes to that map are refused until it closes.

Input parameters:

- `editor` (string): "loenn" or "rysy"
- `map_path` (string, required): The .bin to open
- `room` (string): Room to select on load (Lönn only)
- `storage` (string): Lönn settings folder: "isolated" (own copy, default) or "user" (your normal Lönn)

Output parameters:

- `result` (string)

### `editor_wait` (~66 tokens)

Wait until the user saves in the editor (or it closes), then report what changed. Call again to keep waiting.

Input parameters:

- `session` (string): Session id from editor_open; empty = the latest
- `timeout_s` (integer): Seconds to wait, 1 to 600

Output parameters:

- `result` (string)

### `editor_status` (~22 tokens)

List editor sessions from this server and any other running Lönn.

Output parameters:

- `result` (string)

### `editor_close` (~59 tokens)

Close an editor session. Without force, the editor may ask about unsaved changes and stay open.

Input parameters:

- `force` (boolean): Kill the editor; unsaved editor changes are lost
- `session` (string): Session id; empty = the latest

Output parameters:

- `result` (string)

### `sf_make_tileset` (~54 tokens)

Write the Celeste gray-box tileset for Sprite Fusion (PNG, legend JSON, README).

Input parameters:

- `out_dir` (string): Folder to write to (any absolute path); default <state dir>/sprite-fusion

Output parameters:

- `result` (string)

### `sf_import` (~249 tokens)

Import a Sprite Fusion JSON export (map.zip) as a Celeste room: solid/bg tiles plus gray-box entities.

Input parameters:

- `allow_problems` (boolean): Write even when placement checks fail
- `allow_unknown` (boolean): Place names with no Lönn definition
- `dry_run` (boolean): Only show the result (default)
- `export_path` (string, required): map.zip, its folder, or map.json (any absolute path)
- `legend_path` (string): Custom legend JSON; default: the built-in gray-box legend
- `map_path` (string, required): Map to import into (the base when output_path is set)
- `output_path` (string): Write to this .bin instead of map_path (created from map_path if missing)
- `replace` (boolean): Replace an existing room's fg/bg tiles and entities (triggers, decals, settings stay; solid cells keep their tileset)
- `room` (string, required): Room name (lvl_ is added if the map's rooms use it)
- `x`: Room x in pixels for a new room; default: right of the existing rooms
- `y`: Room y in pixels for a new room

Output parameters:

- `result` (string)

### `summer_init` (~56 tokens)

Create or refresh the Summer Engine gray-box project (tileset with collision, room template, bridge scripts).

Input parameters:

- `project_dir` (string): Project folder; default ~/Documents/CEL-Graybox (LOENN_MCP_SUMMER_PROJECT)

Output parameters:

- `result` (string)

### `summer_open` (~71 tokens)

Open the gray-box project in Summer Engine, optionally on a room scene.

Input parameters:

- `project_dir` (string): Project folder; default ~/Documents/CEL-Graybox
- `scene` (string): Room name, project path (rooms/x.tscn) or res:// path; empty = just the project

Output parameters:

- `result` (string)

### `summer_rooms` (~38 tokens)

List the room scenes in the Summer gray-box project.

Input parameters:

- `project_dir` (string): Project folder; default ~/Documents/CEL-Graybox

Output parameters:

- `result` (string)

### `summer_export_room` (~244 tokens)

Turn a Summer room scene into a Celeste room (new, or replace=true). Same checks and safe write as sf_import.

Input parameters:

- `allow_problems` (boolean): Write even when placement checks fail
- `allow_unknown` (boolean): Place marker entities with no Lönn definition
- `dry_run` (boolean): Only show the result (default)
- `map_path` (string, required): Map to write into (the base when output_path is set)
- `output_path` (string): Write to this .bin instead of map_path
- `project_dir` (string): Project folder; default ~/Documents/CEL-Graybox
- `replace` (boolean): Replace an existing room's fg/bg tiles and entities (solid cells keep their tileset)
- `room` (string): Celeste room name; default: the scene's celeste_room metadata, else the scene name
- `scene` (string, required): Room name, rooms/x.tscn or res:// path in the Summer project
- `x`: Room x in pixels for a new room; default: right of the existing rooms
- `y`: Room y in pixels for a new room

Output parameters:

- `result` (string)

### `summer_import_room` (~105 tokens)

Copy a Celeste room into the Summer project as a scene (fg/bg tiles, gray-box entities as tiles, others as markers).

Input parameters:

- `map_path` (string, required): Map holding the room
- `overwrite` (boolean): Replace an existing scene
- `project_dir` (string): Project folder; default ~/Documents/CEL-Graybox
- `room` (string, required): Room name
- `scene` (string): Scene to write; default rooms/<room>.tscn

Output parameters:

- `result` (string)

### `summer_from_sprite_fusion` (~121 tokens)

Turn a Sprite Fusion export (map.zip) into a Summer room scene, to refine it in Summer before export.

Input parameters:

- `export_path` (string, required): map.zip, its folder, or map.json
- `legend_path` (string): Custom legend JSON; default: the built-in gray-box legend
- `overwrite` (boolean): Replace an existing scene
- `project_dir` (string): Project folder; default ~/Documents/CEL-Graybox
- `scene` (string, required): Room/scene name to create (rooms/<scene>.tscn)

Output parameters:

- `result` (string)

### `pcg_generate_room` (~335 tokens)

Generate a gray-box room with the shared C# PCG core and write it into a map (dry run first).

Input parameters:

- `allow_problems` (boolean): Write even when placement checks fail
- `bg` (string): Background tileset character
- `difficulty` (integer): 1 (gentle) to 10 (hard): hop length, spikes, jump-throughs, refills
- `dry_run` (boolean): Only show the result (default)
- `entry` (integer): Index in exits of the exit the player enters by (must be left or right)
- `exits` (string): Comma list of side:offset:size in tiles (side left/right/top/bottom; offset = first row or column)
- `fg` (string): Foreground tileset character for solid tiles
- `height` (integer): Room height in tiles (23 = one screen)
- `map_path` (string, required): Map to write into (the base when output_path is set)
- `output_path` (string): Write to this .bin instead of map_path
- `replace` (boolean): Replace an existing room's tiles and entities (solid cells keep their tileset)
- `room` (string, required): Room name (lvl_ is added if the map's rooms use it)
- `seed`: Seed; default derived from the map path and room name
- `width` (integer): Room width in tiles (40 = one screen)
- `x`: Room x in pixels for a new room; default: right of the existing rooms
- `y`: Room y in pixels for a new room

Output parameters:

- `result` (string)

### `selecte_generate` (~323 tokens)

Generate a whole level with seleCte (rooms sampled from a Markov model of the vanilla maps), encode it with Julia and validate the .bin.

Input parameters:

- `allow_problems` (boolean): Copy to output_path even when the checklist reports problems
- `height` (integer): Room height in tiles (14 is quick, 23 = one screen)
- `model` (string): Probability-estimation dictionary (file stem in seleCte's probability_estimation_dicts); default pe_d5_full
- `name` (string, required): Level name: the .bin file stem and the work folder (letters, digits, - and _)
- `nb_rooms` (integer): Number of rooms
- `output_path` (string): Also copy the validated .bin to this map path in the workspace (backup, protected maps, open editors apply)
- `proba` (number): Layout shape: 0 is a straight corridor, values near 1 a labyrinth
- `reset_skeleton` (boolean): Redraw the whole layout when a room never comes out playable
- `seed`: Seed for reproducible runs (needs the patched seleCte clone)
- `timeout` (integer): Seconds allowed for each of the two steps
- `tries_limit` (integer): Resample attempts per room before it is kept as it is
- `width` (integer): Room width in tiles (22 is quick, 40 = one screen but slow)
- `work_dir` (string): Folder for the level's files; default <state dir>/selecte/<name>

Output parameters:

- `result` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/magedeline-loenn-mcp/loenn-mcp#diagnostics

## Score history

- 2026-11-05: 42
- 2026-11-04: 42
- 2026-11-03: 42
- 2026-11-02: 42
- 2026-11-01: 42
- 2026-10-31: 42
- 2026-10-30: 42
- 2026-10-29: 42
- 2026-10-28: 42
- 2026-10-27: 42
- 2026-10-26: 42
- 2026-10-25: 42
- 2026-10-24: 42
- 2026-10-23: 42

## Common questions

### What is the loenn-mcp server?

loenn-mcp is listed in the public MCP registry as io.github.Magedeline/loenn-mcp. Celeste map editor for AI agents: read, edit, validate, preview and generate .bin maps. This page covers its MCPB bundle (https://github.com/Magedeline/loenn-mcp/releases/download/v7.2.0/loenn-mcp-7.2.0.mcpb).

### Is the loenn-mcp server safe to use?

loenn-mcp scores 42 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the loenn-mcp server expose?

loenn-mcp exposes 89 tools: list_maps, read_map_overview, read_room, get_room_tiles, add_entity, and 84 more. Their descriptions and schemas cost roughly 7,588 tokens of context every time the server is loaded.

### What licence is the loenn-mcp server under?

loenn-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/Magedeline/loenn-mcp
- Changelog RSS feed: https://verifymcp.io/servers/magedeline-loenn-mcp/loenn-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/magedeline-loenn-mcp/loenn-mcp.json
- HTML version of this page: https://verifymcp.io/servers/magedeline-loenn-mcp/loenn-mcp
