MCP Hub
Back to servers

opensim-mcp

An MCP server that enables remote administration of OpenSimulator via its REST console, allowing for region management, user control, and world object manipulation.

Tools
3
Updated
Dec 9, 2025

OpenSimulator MCP Server

An MCP (Model Context Protocol) server that allows you to control OpenSimulator via console commands. Built with FastMCP.

Features

This MCP server exposes OpenSimulator console commands as tools, including:

  • General Commands: version, uptime, info, logging
  • Region Commands: create, delete, restart, change region context
  • User Commands: show users, alerts, kick, teleport, login control
  • Object Commands: show, delete, backup objects
  • Archive Commands: save/load OAR and IAR files
  • Terrain Commands: load, save, fill, elevate, lower terrain
  • Script Commands: start, stop, suspend, resume scripts
  • Estate Commands: show, reload, set estate properties
  • Stats Commands: show stats, monitor, queues, connections
  • Module Commands: list, load, unload modules
  • Land Commands: show, clear parcels
  • Asset Commands: cache status and management
  • Scene Commands: rotate, scale, translate scene
  • HyperGrid Commands: link/unlink regions
  • User Account Commands: create user, reset password, set user level

Prerequisites

  1. OpenSimulator must be running with the REST console enabled. Start OpenSimulator with:

    ./OpenSim -console=rest
    
  2. Configure the REST console in OpenSim.ini under [Network]:

    [Network]
    ConsoleUser = "admin"
    ConsolePass = "password"
    console_port = 0  ; Uses main HTTP port (default 9000)
    

Installation

# Clone the repository
cd /path/to/opensim-server-mcp

# Install with pip
pip install -e .

# Or with uv
uv pip install -e .

Configuration

The server is configured via environment variables:

VariableDescriptionDefault
OPENSIM_PATHPath to OpenSimulator installation~/opensimulator
OPENSIM_CONSOLE_URLURL of the REST consolehttp://127.0.0.1:9000
OPENSIM_CONSOLE_USERREST console username(empty)
OPENSIM_CONSOLE_PASSREST console password(empty)

Usage

Running the Server

# Set environment variables
export OPENSIM_PATH=~/opensimulator
export OPENSIM_CONSOLE_URL=http://127.0.0.1:9000
export OPENSIM_CONSOLE_USER=admin
export OPENSIM_CONSOLE_PASS=secret

# Run the server
opensim-mcp

Configuring with Claude Desktop

Add to your Claude Desktop configuration (~/.config/claude/claude_desktop_config.json on Linux):

{
  "mcpServers": {
    "opensim": {
      "command": "opensim-mcp",
      "env": {
        "OPENSIM_PATH": "/home/user/opensimulator",
        "OPENSIM_CONSOLE_URL": "http://127.0.0.1:9000",
        "OPENSIM_CONSOLE_USER": "admin",
        "OPENSIM_CONSOLE_PASS": "secret"
      }
    }
  }
}

Configuring with Windsurf/Cascade

Add to your MCP settings:

{
  "mcpServers": {
    "opensim": {
      "command": "opensim-mcp",
      "env": {
        "OPENSIM_PATH": "/home/rjodouin/opensimulator",
        "OPENSIM_CONSOLE_URL": "http://127.0.0.1:9000",
        "OPENSIM_CONSOLE_USER": "admin",
        "OPENSIM_CONSOLE_PASS": "secret"
      }
    }
  }
}

Available Tools (only three)

All OpenSimulator console commands are issued through three MCP tools:

  • get(command, args="") – for read-only/show/info queries.
  • set(command, args="") – for mutating/config/management actions.
  • run(command) – for any raw console command (escape hatch).

Examples by category


General Server Commands

These commands work on both simulator and ROBUST consoles.

CommandDescriptionExample
command-scriptRun a command script containing console commandsrun("command-script myscript.txt")
quit / shutdownShutdown the serverset("quit")
show infoShow server information (version and startup path)get("show info")
show uptimeShow server startup time and uptimeget("show uptime")
show versionShow server versionget("show version")
get log levelPrint the current console logging levelget("get log level")
set log levelChange the console logging level (e.g., off, debug)set("set log level", "debug")
helpGet general command list or help on a specific commandget("help"), get("help", "terrain")

Debug Commands

CommandDescriptionExample
debug httpTurn on/off extra logging for HTTP request debuggingset("debug http", "in 5")
debug threadpool levelTurn on/off logging of activity in the main threadpoolset("debug threadpool level", "1")

Simulator Commands

General

CommandDescriptionExample
change regionSelect region for subsequent commands; "root" selects allset("change region", "MyRegion")
debug packetTurn on packet debugging for viewer communicationsset("debug packet", "1")
emergency-monitoringTurn emergency debugging monitoring on/offset("emergency-monitoring", "on")
link-mappingSet local grid coordinate to map to remote hypergridset("link-mapping", "1000 1000")
link-regionLink a HyperGrid regionset("link-region", "1000 1000 grid.example.com 8002 \"Remote\"")
unlink-regionUnlink a hypergrid regionset("unlink-region", "\"Remote Region\"")
modules listList modulesget("modules list")
modules loadLoad a moduleset("modules load", "ModuleName")
modules unloadUnload a moduleset("modules unload", "ModuleName")
monitor reportReturns statistics about the current region/simulatorget("monitor report")
set terrain heightsSet terrain texture heights on a cornerset("set terrain heights", "0 20 40")
set terrain textureSet terrain texture by numberset("set terrain texture", "1 <uuid>")
set water heightSet water height simulator-wide or per regionset("set water height", "20")
show capsShow all registered capabilities URLsget("show caps")
show circuitsShow agent circuit dataget("show circuits")
show connectionsShow connections dataget("show connections")
show http-handlersShow all registered HTTP handlersget("show http-handlers")
show hyperlinksList hypergrid linked regionsget("show hyperlinks")
show modulesShow module dataget("show modules")
show pending-objectsShow pending objects in viewer queuesget("show pending-objects")
show pqueuesShow priority queue data for each clientget("show pqueues"), get("show pqueues", "full")
show queuesShow queue data for agent connectionsget("show queues")
show threadsShow persistent threads registered with the systemget("show threads")
show throttlesShow throttle data for each client connectionget("show throttles"), get("show throttles", "full")

Appearance Commands

CommandDescriptionExample
appearance findFind which avatar uses a given asset as baked textureget("appearance find", "<uuid>")
appearance rebakeRequest user's viewer to rebake and reupload texturesset("appearance rebake", "First Last")
appearance sendSend appearance data for avatars to other viewersset("appearance send"), set("appearance send", "First Last")
appearance showShow appearance information for avatarsget("appearance show"), get("appearance show", "First Last")

Archive Commands

CommandDescriptionExample
load iarLoad user inventory archiveset("load iar", "First Last /Inventory password archive.iar")
load oarLoad OpenSimulator region archive (replaces region)set("load oar", "region.oar")
load xmlLoad region data from XML format (deprecated)set("load xml", "backup.xml")
load xml2Load region data from XML2 formatset("load xml2", "backup.xml")
save iarSave user inventory archiveset("save iar", "First Last /Inventory password archive.iar")
save oarSave current region to OpenSimulator archiveset("save oar", "region.oar")
save prims xml2Save named prim to XML2set("save prims xml2", "\"My Prim\" prim.xml")
save xmlSave prims to XMLset("save xml", "backup.xml")
save xml2Save prims to XML2 formatset("save xml2", "backup.xml")

Asset Commands (fcache)

CommandDescriptionExample
fcache assetsDeep scan and cache all assets in all scenesset("fcache assets")
fcache clearRemove all assets in cache (file/memory optional)set("fcache clear"), set("fcache clear", "file")
fcache clearnegativesClear negative cache entries if enabledset("fcache clearnegatives")
fcache expirePurge cached assets older than specified dateset("fcache expire", "2024-01-01")
fcache statusDisplay cache statusget("fcache status")
j2k decodeDo JPEG2000 decoding of an assetset("j2k decode", "<asset-uuid>")

Config Commands

CommandDescriptionExample
config getGet current configuration (section/key optional)get("config get"), get("config get", "Network")
config saveSave current configuration to a fileset("config save", "/path/to/config.ini")
config setSet a particular configuration valueset("config set", "Section Key Value")
config showSynonym for config getget("config show")

Land Commands

CommandDescriptionExample
land showShow all parcels on the current regionget("land show")
land clearClear all parcels on the landset("land clear")

Map Commands

CommandDescriptionExample
export-mapSave an image of the world mapset("export-map", "worldmap.jpg")
generate mapRegenerate and store map tileset("generate map")

Object Commands

CommandDescriptionExample
backupPersist unsaved object changes immediatelyset("backup")
delete object creatorDelete scene objects by creator UUIDset("delete object creator", "<creator-uuid>")
delete object idDelete scene object by UUID or localIDset("delete object id", "<uuid-or-localID>")
delete object nameDelete scene object by name (supports --regex)set("delete object name", "\"Object Name\"")
delete object outsideDelete all objects outside region boundariesset("delete object outside")
delete object ownerDelete scene objects by owner UUIDset("delete object owner", "<owner-uuid>")
dump object idDump object serialization to file for debuggingset("dump object id", "<uuid>")
edit scaleChange the scale of a named primset("edit scale", "\"Object Name\" 1.0 1.0 1.0")
force updateForce region to send all clients updates about objectsset("force update")
show object idShow details of object by UUID or localIDget("show object id", "<uuid-or-localID>")
show object nameShow details of objects by name (supports --regex)get("show object name", "\"Object Name\"")
show part idShow details of object part by UUID or localIDget("show part id", "<uuid-or-localID>")
show part nameShow details of object parts by name (supports --regex)get("show part name", "\"Part Name\"")

Estate Commands

CommandDescriptionExample
estate createCreate a new estateset("estate create", "<owner-uuid> \"Estate Name\"")
estate link regionAttach a region to an estateset("estate link region", "<estate-id> <region-id>")
estate set nameRename an estateset("estate set name", "<estate-id> \"New Name\"")
estate set ownerChange estate owner (by name or UUID)set("estate set owner", "<estate-id> First Last")
estate showShow estate name, ID, and owner for regionsget("estate show")
reload estateReload estate dataset("reload estate")

Region Commands

CommandDescriptionExample
change regionSelect region for subsequent commandsset("change region", "MyRegion")
create regionCreate a new regionset("create region", "NewRegion Regions/NewRegion.ini")
delete-regionDelete a region from diskset("delete-region", "OldRegion")
region getShow region parameters (name, UUID, location, etc.)get("region get")
region restart abortAbort a scheduled region restartset("region restart abort", "Restart cancelled")
region restart blueboxSchedule restart with dismissable bluebox noticeset("region restart bluebox", "\"Msg\" 120 60 30")
region restart noticeSchedule restart with transient noticeset("region restart notice", "\"Msg\" 120 60 30")
region setSet region parameters (agent-limit, max-agent-limit)set("region set", "agent-limit 40")
remove-regionRemove a region from the simulatorset("remove-region", "TempRegion")
restartRestart all sims in this instanceset("restart")
set region flagsSet database flags for regionset("set region flags", "MyRegion DefaultRegion")
show neighboursShow the local regions' neighboursget("show neighbours")
show ratingsShow rating dataget("show ratings")
show regionShow region parametersget("show region")
show regionsShow all regions data (names, coords, ports, estates)get("show regions")

Region Flags: DefaultRegion, FallbackRegion, RegionOnline, NoDirectLogin, Persistent, LockedOut, NoMove, Reservation, Authenticate, Hyperlink, DefaultHGRegion


Scene Commands

CommandDescriptionExample
debug sceneTurn on scene debuggingset("debug scene", "on")
rotate sceneRotate scene around 128,128 axis (0-360 degrees)set("rotate scene", "90")
scale sceneScale all scene objects by factor (1.0 = original)set("scale scene", "1.2")
translate sceneMove entire scene to new coordinateset("translate scene", "10,0,0")

Script Commands

CommandDescriptionExample
scripts resumeResume all suspended scripts (or specific script)set("scripts resume")
scripts showShow script informationget("scripts show")
scripts startStart all stopped scripts (or specific script)set("scripts start")
scripts stopStop all running scripts (or specific script)set("scripts stop")
scripts suspendSuspend all running scripts (or specific script)set("scripts suspend")

Stats Commands

CommandDescriptionExample
show statsShow useful statistical information for this serverget("show stats")
stats recordRecord stats periodically to a separate log fileset("stats record")
stats saveSave a snapshot of current stats to a fileset("stats save", "stats.txt")
stats showSynonym for show statsget("stats show")

Terrain Commands

CommandDescriptionExample
terrain bakeSave current terrain into region's baked mapset("terrain bake")
terrain effectRun a specified plugin effect (or list)set("terrain effect", "list")
terrain elevateRaise current heightmap by specified amountset("terrain elevate", "5.0")
terrain fillFill current heightmap with specified valueset("terrain fill", "25")
terrain flipFlip current terrain about X or Y axisset("terrain flip", "x")
terrain loadLoad terrain from fileset("terrain load", "terrain.r32")
terrain load-tileLoad terrain from section of larger fileset("terrain load-tile", "terrain.png 2 2 0 0")
terrain lowerLower current heightmap by specified amountset("terrain lower", "2.5")
terrain maxSet maximum terrain heightset("terrain max", "100")
terrain minSet minimum terrain heightset("terrain min", "0")
terrain modifyArea-of-effect terraforming with optional taperset("terrain modify", "raise 10 -ell=128,128,64")
terrain multiplyMultiply heightmap by specified valueset("terrain multiply", "0.8")
terrain newbrushesEnable experimental terrain brushesset("terrain newbrushes", "true")
terrain rescaleRescale terrain to fit between min/max heightsset("terrain rescale", "0 100")
terrain revertLoad baked map terrain into heightmapset("terrain revert")
terrain saveSave current heightmap to fileset("terrain save", "terrain.png")
terrain save-tileSave heightmap to section of larger fileset("terrain save-tile", "terrain.png 2 2 0 0")
terrain showShow terrain height at given coordinateget("terrain show", "128 128")
terrain statsShow heightmap info for debuggingget("terrain stats")

Supported formats: .r32, .f32, .ter, .raw, .jpg, .jpeg, .bmp, .png, .gif, .tif, .tiff


Tree Commands

CommandDescriptionExample
tree activeChange activity state for trees moduleset("tree active", "true")
tree freezeFreeze/unfreeze activity for a defined copseset("tree freeze", "CopseName")
tree loadLoad a copse definition from XML fileset("tree load", "copse.xml")
tree plantStart planting on a copseset("tree plant", "CopseName")
tree rateReset tree update rate (milliseconds)set("tree rate", "1000")
tree reloadReload copse definitions from in-scene treesset("tree reload")
tree removeRemove copse definition and all its treesset("tree remove", "CopseName")
tree statisticsLog statistics about the treesget("tree statistics")

User Commands

CommandDescriptionExample
alertSend in-world alert to everyoneset("alert", "Server restarting in 5 minutes")
alert-userSend in-world alert to specific userset("alert-user", "First Last Your message")
bypass permissionsBypass in-world permission checksset("bypass permissions", "true")
debug permissionsTurn on permissions debuggingset("debug permissions", "on")
force permissionsForce permissions on or offset("force permissions", "on")
kick userKick a user off the simulatorset("kick user", "First Last Please relog")
login disableDisable user entry to this simulatorset("login disable")
login enableEnable user entry to this simulatorset("login enable")
login statusShow whether logins are enabled or disabledget("login status")
show usersShow info about connected users (full for child agents)get("show users"), get("show users", "full")
teleport userTeleport a user to a specific destinationset("teleport user", "First Last RegionName")

Windlight/LightShare Commands

CommandDescriptionExample
windlight disableDisable the windlight pluginset("windlight disable")
windlight enableEnable the windlight pluginset("windlight enable")
windlight loadLoad windlight profile from database and broadcastset("windlight load")

YEngine Commands

CommandDescriptionExample
yeng cvvShow compiler version valueget("yeng cvv")
yeng helpShow YEngine helpget("yeng help")
yeng lsList scripts (options: -full, -max, -topcpu, -queues)get("yeng ls"), get("yeng ls", "-full -max=50")
yeng mvvShow/set migration version valueget("yeng mvv"), set("yeng mvv", "1")
yeng pevPost event to scriptsset("yeng pev", "-all touch_start 1")
yeng resetReset scripts (-all or by name)set("yeng reset", "-all")
yeng resumeResume script processingset("yeng resume")
yeng suspendSuspend script processingset("yeng suspend")
yeng tracecallsEnable/disable call tracingset("yeng tracecalls", "yes")
yeng verboseEnable/disable verbose outputset("yeng verbose", "yes")

ROBUST Service Commands

These commands are available on the ROBUST console (or standalone console).

Asset Service

CommandDescriptionExample
delete assetDelete an asset from the databaseset("delete asset", "<asset-uuid>")
dump assetDump an asset to the filesystemset("dump asset", "<asset-uuid>")
show asset / show digestShow summary information about an assetget("show asset", "<asset-uuid>")

Grid Service

CommandDescriptionExample
deregister region idDeregister a region manuallyset("deregister region id", "<region-uuid>")
set region flagsSet database flags for regionset("set region flags", "MyRegion DefaultRegion")
show region atShow details on region at given coordinateget("show region at", "1000 1000")
show region nameShow details on a region by nameget("show region name", "MyRegion")
show regionsShow details on all regionsget("show regions")

User Service

CommandDescriptionExample
create userCreate a new user accountset("create user", "First Last password email")
reset user passwordSet a new password for a userset("reset user password", "First Last newpass")
show accountShow account details for given userget("show account", "First Last")

Login Service

CommandDescriptionExample
login levelSet minimum user level allowed to loginset("login level", "200")
login resetReset login level to default valueset("login reset")
login textSet text to display during loginset("login text", "Welcome to the grid!")
set user levelSet user level (god status, login permission)set("set user level", "First Last 200")

HyperGrid Commands

CommandDescriptionExample
link-mappingSet local grid coordinate for remote hypergrid mappingset("link-mapping", "1000 1000")
link-regionLink a HyperGrid region at specified coordinatesset("link-region", "8998 8998 grid.example.com 9006 \"Name\"")
show hyperlinksList all hypergrid linked regionsget("show hyperlinks")
unlink-regionUnlink a hypergrid region by local nameset("unlink-region", "\"Remote Region\"")

Generic / Raw Commands

CommandDescriptionExample
Any commandExecute any raw console commandrun("any raw console command")

License

MIT License

Reviews

No reviews yet

Sign in to write a review