dos2-gm-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dos2-gm-mcp Spawn two fire imps next to the skipper and tell me everyone's health."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dos2-gm-mcp
English · Русский
An MCP server that lets an AI assistant prepare and run Game Master mode campaigns in Divinity: Original Sin 2 – Definitive Edition.
It works on two layers:
Campaign files. Reads and edits a GM campaign on disk: NPC and item templates, vignettes with your own art, map stickies, the journal, scene atmosphere, add-on mods. Every write makes a backup first.
Live game. Talks to the running game through a tiny bridge mod for Norbyte's Script Extender: list who is on the level, spawn an NPC from a template, move, rename, level up, hide and show, or run any Lua on the game server.

Overview map with GM stickies | Tavern scene with traders and stashes |
|
|
What you can ask for
"Show me what is in the campaign My Campaign: scenes, templates, vignettes."
"Make an NPC template Old Greta, level 10, based on the witch archetype from the Larian sample campaign, with these three skills."
"Add a vignette with this picture and three vote options."
"Put a sticky on the overview map with the fight checklist."
"The game is running: spawn two fire imps next to the skipper and tell me everyone's health."
The GM campaigns shipped by Larian are readable too, so they work as a library of NPC templates to copy from.
Related MCP server: FoundryVTT MCP Server
Requirements
Windows, Divinity: Original Sin 2 – Definitive Edition (tested on Steam build 3.6.117.3735)
uv and Python 3.11+
.NET 8 runtime or newer (LSLib's
Divine.exeneeds it)For the live layer only: Script Extender v58 or newer (tested on v60)
Install
git clone https://github.com/o-shabashov/dos2-gm-mcp
cd dos2-gm-mcp
uv sync
uv run dos2-gm-fetch-lslibThe last command downloads the official LSLib v1.20.4 release into ./lslib and checks its SHA-256. LSLib is Norbyte's work under the MIT license; this repository does not redistribute it.
Connect it to Claude Code:
claude mcp add dos2-gm --scope user -- uv --directory C:\path\to\dos2-gm-mcp run dos2-gm-mcpOr to any other MCP client:
{
"mcpServers": {
"dos2-gm": {
"command": "uv",
"args": ["--directory", "C:\\path\\to\\dos2-gm-mcp", "run", "dos2-gm-mcp"]
}
}
}For Claude Desktop there is also a one-file bundle: download dos2-gm-mcp.mcpb from the latest release, open it, then ask the assistant to call dos2_fetch_lslib once. The bundle keeps LSLib and backups in ~/.dos2-gm-mcp.
The game folder and Documents\Larian Studios\Divinity Original Sin 2 Definitive Edition are found automatically (Steam libraries, relocated Documents folders). Override with environment variables or a config.json in the project root:
Variable | Meaning |
| the |
| the game folder |
| path to |
| where backups go (default |
| the |
| where LSLib, backups, the cache and |
Tools
The campaign argument accepts a campaign name, its folder name, its UUID, or a part of any of them.
Read | Returns |
| paths, whether the game is running, the list of campaigns |
| one-time setup: downloads LSLib and checks its SHA-256 (same as |
| metadata and add-ons, scenes, maps with pins, vignettes, templates, stickies, journal |
| characters in a scene (name, template, position, health, alignment, encounter), encounters, stickies |
| NPC and item templates, or one template in full |
| search templates across all campaigns by name, stats, skills, items |
| vignettes and stickies in full |
| any campaign file as LSX, with an XPath filter |
| backups of a campaign |
Write | Does |
| NPC template: copy a base from any campaign, set name, level, alignment, stat and ability changes, talents, skills, equipment |
| item template |
| vignette with your own image or a stock one, with vote answers |
| sticky on the overview map; edits the text of a scene sticky |
| journal categories, chapters and paragraphs |
| scene atmosphere and music |
| campaign name, description, author |
| attach a ready-made |
| delete |
| full copy of a campaign, restore from any backup |
Live (game running) | Does |
| what is ready: game, Script Extender, the bridge |
| build the bridge into |
| who is on the level: GUID, name, template, stats, level, health, alignment, position |
| spawn a character from a root template or a GM template, at a point or next to someone |
| teleport; change name, level, alignment; take off stage and bring back |
| run Lua on the game server ( |
Safety
Writes go to a closed campaign: the game is closed or sits in the main menu. While the game process is running a write needs
allow_running=true.Before every write the previous files are copied to
backups\<campaign folder>\<time>-<operation>.dos2_restorebrings any of them back.Placed NPCs and encounters live in the scene cache and are read-only here; you place them in the game, or through the live layer.
dos2_live_luaexecutes arbitrary Lua inside your game. Use it with an assistant you trust.
Live layer setup
Install Script Extender: put its
DXGI.dllnext toEoCApp.exeinDefEd\bin.Ask the assistant to run
dos2_bridge_installfor your campaign (the game must be closed). It builds the bridge mod and adds it to the campaign's add-ons.Load the campaign in GM mode and call
dos2_live_status.
The bridge is a server-side Lua mod (bridge/). On a tick it reads a command from Osiris Data/dos2gm-mcp, runs it and writes the answer; there are no sockets and nothing listens on the network. In multiplayer every player needs the same .pak and Script Extender, as with any DOS2 mod.
What we learned about GM mode
Notes for people building their own tools; all verified in the game.
NPC templates live in the campaign's
Eggs.lsfasGMExportCharacter. The secondAttributenode of a template holds the Game Master's changes as a delta over the base stats.Equipment slots: 0 helmet, 1 chest, 2 legs, 3 weapon, 4 shield, 5 and 10 rings, 6 belt, 7 boots, 8 gloves, 9 amulet, 12 horns, 15+ backpack.
A map sticky has
Type = 2,UI= map UUID,NoteUIX/Yin map pixels. A scene sticky hasType = 0and hangs on an invisible marker item inLevelCache.A mod's
meta.lsxneeds a Definitive EditionPublishVersion(for example909321303). With1.0.0.0the game flags the mod as made for Classic Edition and refuses it."Play campaign" runs on a copy of the campaign; the prepared campaign stays untouched. Loading a GM savegame uses the mod list from the main menu, so tick your add-on mods there as well.
Any
Osi.*call while a campaign or level is loading crashes Script Extender natively, even thoughExt.Osiris.IsCallable()already says yes. Gate on game stateRunning,PausedorGameMasterPause.During the Game Master pause, Osiris delays world actions (placing, teleporting) until the pause is lifted, and
SetOnStageright after creating a character gets lost. The bridge marks such answers withapplies_on_unpause.CombatRoundStartedandCharacterVitalityChangednever fire in GM mode. Count rounds by turns, poll health.Script Extender's console refuses commands during the Game Master pause; the file bridge keeps working.
Items accept
CustomDisplayName,CustomDescriptionandCustomBookContentat runtime and the values reach the players.
Tests
uv run python tests/bridge_test.py # the real bridge Lua in Lua 5.3 against stubs
uv run python tests/mcp_probe.py # MCP handshake, tool list and one call over stdio
uv run python tests/check_mapping.py # scenes of all campaigns, read-only
uv run python tests/smoke_read.py "My Campaign" # read-only
uv run python tests/write_test.py <temp folder> # writes into copies of campaignsCredits
LSLib and Script Extender by Norbyte make all of this possible.
Divinity: Original Sin 2 is a game by Larian Studios. This is an unofficial fan tool, not affiliated with or endorsed by Larian Studios. Screenshots show the game's own art.
License
Available Tools
34 toolsdos2_addonAttach or detach a .pak add-onADestructiveIdempotent
Attaches a ready-made mod from a .pak file to the campaign as an add-on, or detaches it with attach=false. On attach the file is copied into the game's Mods folder; UUID, name, version and folder are read from the meta.lsx inside the pak. Detaching leaves the .pak in Mods.
Writes meta.lsf. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
Players need the same .pak, as with any add-on. Fails if the file is missing or holds no single meta.lsx.
Returns the module name, author, UUID, the .pak path and the campaign's add-on list. To build a mod from a
source folder use dos2_mod_install.
Inputs: pak (required), campaign (required), attach, allow_running.
dos2_backupBack up the whole campaignA
Copies the entire campaign folder into the backups folder as a new backup labelled "full". Nothing in the campaign changes, and it is safe while the game is running.
Every write tool already backs up the files it touches, so use this for a complete snapshot before a risky
series of edits or before a play session. Returns the backup id and its path. List backups with dos2_backups
and bring one back with dos2_restore.
Inputs: campaign (required).
dos2_backupsList campaign backupsARead-onlyIdempotent
Lists the campaign's backups, newest first. Each entry has the id (timestamp plus operation label, e.g. "...-npc-template" or "...-full"), the label, the files that were saved, and the files that the operation created.
Read-only. Use it to find the id to pass to dos2_restore when an edit has to be undone. Returns an empty list
when the campaign has no backups yet.
Inputs: campaign (required). Returns: result
dos2_bridge_detachDetach the bridge modADestructiveIdempotent
Removes this server's bridge mod from the campaign's add-ons in meta.lsf. After that the dos2_live_* tools no longer work for this campaign, and players no longer need the bridge .pak. The .pak itself stays in the game's Mods folder, and nothing happens if the bridge was not attached.
The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
Returns the backup id and the campaign's add-on list. Attach again with dos2_bridge_install.
Inputs: campaign (required), allow_running.
dos2_bridge_installBuild and attach the bridge modADestructiveIdempotent
Builds this server's bridge mod into the game's Mods folder (DOS2GMBridge_....pak, overwriting the previous build) and, when campaign is given, adds it to that campaign's add-ons in meta.lsf. The bridge is what the dos2_live_* tools talk to; it needs Script Extender in the game.
The previous file is backed up first; undo with dos2_restore. Attaching: Fails with an error while the game process is running unless allow_running=true.
In multiplayer every player needs the same .pak and Script Extender, as with any add-on; after a rebuild, send
them the new file. Returns the .pak path, the packed files and the campaign's add-on list. Check the result
with dos2_live_status; remove with dos2_bridge_detach.
Inputs: campaign, allow_running.
dos2_campaignCampaign overviewARead-onlyIdempotent
Reads one campaign and returns a compact overview: metadata and attached add-on mods, scenes, Overview maps with their pins, vignettes (uuid, title, answers), NPC and item templates (kind, name, level), sticky notes (title, kind, folder) and the whole journal.
Read-only. Use it to orient yourself before reading details or editing. For full content follow up with
dos2_scene (who stands in a scene), dos2_template (one template), dos2_vignettes or dos2_notes. To pick a
campaign in the first place use dos2_status.
Inputs: campaign (required).
dos2_campaign_metaEdit campaign name, description, authorADestructiveIdempotent
Changes the campaign's name, description and author in meta.lsf, the same fields the game edits in its campaign settings. Only the fields you pass are changed. With none of them given nothing is written and the current metadata is returned.
The campaign folder keeps its name, because the game identifies the campaign by it. The previous file is backed up first; undo with dos2_restore.
Fails with an error while the game process is running unless allow_running=true. Returns the backup id and the resulting metadata.
Inputs: campaign (required), name, author, description, +1 more.
dos2_delete_noteDelete a GM sticky noteADestructive
Deletes one Game Master sticky note from the campaign, found by UUID or exact title. Works for notes on an Overview map and for notes bound to an object in a scene.
Writes Notes.lsf. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
Fails with an error when nothing matches. Returns the UUIDs removed and the backup id. To change a note's text
instead, use dos2_put_note.
Inputs: note (required), campaign (required), allow_running.
dos2_delete_templateDelete a saved templateADestructive
Deletes a saved NPC or item template from the campaign by name. If an NPC template and an item template share the name, both are removed. Characters already placed in scenes from that template stay as they are.
Writes Eggs.lsf. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
Fails with an error when no template has that name. Returns the number of templates removed and the backup id.
Inputs: name (required), campaign (required), allow_running.
dos2_delete_vignetteDelete a vignetteADestructive
Deletes one vignette from the campaign, found by UUID or exact title. Its picture files stay in the campaign's Vignettes/Illustrations folder, so other vignettes that use the same image keep working.
Writes Vignettes.lsf. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
Fails with an error when nothing matches. Returns the UUIDs removed and the backup id.
Inputs: campaign (required), vignette (required), allow_running.
dos2_fetch_lslibDownload LSLib (one-time setup)AIdempotent
One-time setup: downloads the official LSLib release by Norbyte (Divine.exe, MIT license) from GitHub, verifies its pinned SHA-256 and unpacks it into the server's data folder. Every tool that reads or writes campaign files needs Divine.exe, so run this when dos2_status reports divine_found=false.
Needs internet access. Writes only into the data folder; the game and the campaigns are not touched. When
Divine.exe is already there it returns at once without downloading. Returns {result, source}, or {error} on a
network failure or checksum mismatch (then nothing is unpacked).
Inputs: force.
dos2_find_templatesSearch templates across campaignsARead-onlyIdempotent
Searches saved Game Master templates in every campaign on disk (or in one) and returns matching summaries with the campaign each one lives in. Larian's sample campaigns are included, so this works as a library of ready NPCs.
Read-only. Use it to find a template to copy: pass a hit to dos2_put_npc_template as base="Campaign:Name". To
list one campaign's templates without searching use dos2_templates.
Inputs: kind, limit, query, campaign. Returns: result
dos2_live_charactersList characters on the live levelARead-onlyIdempotent
Lists the characters on the level currently loaded in the running game, player characters included: GUID, name, root template, stats entry, level, vitality, alignment and position. With near it returns only those within radius of that character.
Read-only; needs the game running with the bridge mod (see dos2_live_status), otherwise it fails with a timeout
error. Use it to get GUIDs and positions for dos2_live_move, dos2_live_set, dos2_live_stage and
dos2_live_spawn. For what is saved in the campaign files rather than the running game, use dos2_scene.
Inputs: near, limit, radius. Returns: result
dos2_live_luaRun Lua in the live gameADestructive
Runs arbitrary Lua on the game server through Script Extender, in the bridge mod's context, and returns the value of its return statement. The Ext and Osi APIs are available. This is the escape hatch for anything the other live tools do not cover: items, statuses, combat, level changes.
It can change or break anything in the running session, so prefer the dedicated tools (dos2_live_characters,
dos2_live_spawn, dos2_live_move, dos2_live_set, dos2_live_stage) when they fit. The returned value must be
JSON-serializable. Lua errors come back as an error with the message; a call that outlives timeout fails. Needs
the bridge (see dos2_live_status). Do not call Osi functions while a level is still loading.
Inputs: code (required), timeout.
dos2_live_moveTeleport a live characterAIdempotent
Teleports one character on the live level to the point x, y, z, or next to another character with the offset dx, dz. Works on NPCs and on player characters.
Changes only the running game, not the campaign files. During the Game Master pause the move is applied after
unpausing (the result has applies_on_unpause=true). Fails with an error when who matches no character or more
than one (then pass a GUID), or when neither a full x, y, z nor near is given. Needs the bridge (see
dos2_live_status). Get positions from dos2_live_characters.
Inputs: who (required), x, y, z, +3 more.
dos2_live_setRename, level up or re-align a live characterAIdempotent
Changes a character that already stands on the live level: its displayed name, its level and its alignment towards the party. Only the fields you pass change.
Changes only the running game, not the campaign files or the template the character came from. Setting
alignment to "Evil NPC" makes the character hostile, which can start combat. Fails with an error when who
matches no character or more than one (then pass a GUID). Needs the bridge (see dos2_live_status). Returns the
character's new state. To move a character use dos2_live_move; to hide one use dos2_live_stage.
Inputs: who (required), name, level, alignment.
dos2_live_spawnSpawn a character in the live gameA
Creates a new character on the level loaded in the running game, at a point or next to another character. Each call adds one more character, so repeating it makes duplicates; take one away with dos2_live_stage.
From a GM template only the model, level, alignment and name are used: its stat edits, skills and items are NOT
applied this way (placing it from the game's "Creatures and Items" panel applies them). During the Game Master
pause the character is created at once but moves into place only after unpausing: the result then has
applies_on_unpause=true and its position still reads 0, 0, 0. Needs the bridge (see dos2_live_status). Returns
the new character's GUID and state.
Inputs: template (required), x, y, z, +7 more.
dos2_live_stageHide or show a live characterAIdempotent
Takes a character on the live level off stage or brings it back. An off-stage character is invisible and takes no part in the scene but stays in the level with its state, so this is the reversible way to remove an NPC or to prepare one for a later entrance; nothing is deleted.
Changes only the running game. Fails with an error when who matches no character or more than one (then pass a
GUID). Needs the bridge (see dos2_live_status). Returns the character's new state.
Inputs: on (required), who (required).
dos2_live_statusLive layer readinessARead-onlyIdempotent
Checks everything the live tools (dos2_live_*) need and reports what is missing: whether the game is running, whether Script Extender is installed next to the game and its settings, whether the bridge mod .pak is built, which campaigns have it attached, and whether the bridge's heartbeat is coming in (it writes one about every 2 seconds while a campaign is loaded in Game Master mode).
Read-only, no parameters. Call it before the first live tool of a session and whenever a live tool times out.
If the bridge is not built or attached, run dos2_bridge_install with the game closed. For file-level setup
(campaign list, Divine.exe) use dos2_status.
Inputs: no named parameters.
dos2_mod_installBuild a mod folder and attach itADestructiveIdempotent
Packs your own mod from a source folder into the game's Mods folder as .pak (overwriting a previous build) and, when campaign is given, adds it to that campaign's add-ons. UUID, name, version and folder come from the mod's meta.lsx.
Use it for mods you develop yourself; for a ready third-party .pak use dos2_addon, and for this server's bridge
use dos2_bridge_install. Fails if PublishVersion in meta.lsx is below a Definitive Edition editor version (use
909321303): the game would mark the mod as Classic and refuse it. The previous file is backed up first; undo with dos2_restore. Attaching: Fails with an error while the game process is running unless allow_running=true.
Returns the .pak path, packed files, module name and UUID, and the add-on list.
Inputs: source (required), campaign, allow_running.
dos2_notesList GM sticky notesARead-onlyIdempotent
Returns all Game Master sticky notes of the campaign with their full text. Each note has uuid, title, text, folder and kind: a "map" note sits on an Overview map (map UUID, x and y in map pixels), a "scene" note is bound to an object inside a scene (scene ID and the bound object). Players never see these notes.
Read-only. When titles are enough, dos2_campaign is cheaper. Create or change a note with dos2_put_note and
remove one with dos2_delete_note.
Inputs: campaign (required). Returns: result
dos2_put_item_templateCreate or replace an item templateADestructiveIdempotent
Creates a saved item template in the campaign (the Game Master's "Creatures and Items" panel), or replaces the one with the same name. Use it for quest items, readable notes and books, and custom weapons or armor the GM hands out.
Writes Eggs.lsf. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
Returns created (true for a new template), a summary of the template and the backup id. For NPC templates use
dos2_put_npc_template; to give an NPC template items, pass them in its items parameter instead.
Inputs: name (required), campaign (required), base, book, +8 more.
dos2_put_journalReplace the GM journalADestructiveIdempotent
Replaces the campaign's whole Game Master journal (categories, chapters, paragraphs) with the structure you pass. Entries that are not in categories are removed, so read the current journal with dos2_campaign first and send it back with your changes.
Writes Journal.lsf. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
The shared flag was not verified against Larian's samples; the GM can also share entries in the game. Returns
the backup id and the journal as it now reads.
Inputs: campaign (required), categories (required), allow_running.
dos2_put_noteCreate or update a GM sticky noteADestructiveIdempotent
Creates a Game Master sticky note on an Overview map, or changes an existing note. Players never see these notes. An existing note is found by key if given, otherwise by an equal title; if none matches, a new one is created on the map.
A note inside a scene hangs on an invisible marker item of the level, so new scene notes have to be placed in
the game; for one that already exists this tool changes title, text and folder and keeps its binding.
Writes Notes.lsf. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
Fails with an error if the map is not found or has to be specified. Returns created, the note's uuid, where it
sits and the backup id. Read notes with dos2_notes; remove one with dos2_delete_note.
Inputs: text (required), title (required), campaign (required), x, +5 more.
dos2_put_npc_templateCreate or update an NPC templateADestructiveIdempotent
Creates a saved NPC template in the campaign (the Game Master's "Creatures and Items" panel), or changes the one that already has this name. The usual way is to copy a ready NPC with base and adjust it: name, level, alignment, GM stat edits, skills, items. Parameters you omit keep the base's values.
Writes Eggs.lsf. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
The template only defines what the GM can place: it does not put a character into a scene (place it in the game,
or use dos2_live_spawn). Returns created (true for a new template), the resulting template in full and the
backup id. For item templates use dos2_put_item_template.
Inputs: name (required), campaign (required), base, bonus, +15 more.
dos2_put_vignetteCreate or replace a vignetteADestructiveIdempotent
Creates a vignette (an illustrated story card the Game Master shows to players, optionally with a vote), or replaces an existing one. The vignette to replace is found by key if given, otherwise by an equal title; otherwise a new one is created.
Writes Vignettes.lsf and, with image, copies the picture into the campaign's Vignettes/Illustrations. The previous file is backed up first; undo with dos2_restore.
Fails with an error while the game process is running unless allow_running=true. Fails with an error if the image file does not exist. Returns created, the vignette's uuid, the image
name and size, and the backup id. Read existing vignettes with dos2_vignettes.
Inputs: text (required), title (required), campaign (required), key, +8 more.
dos2_rawRead a campaign file as LSXARead-onlyIdempotent
Converts any binary campaign file (.lsf) to LSX text and returns it, whole or filtered by XPath. This is the escape hatch for exploring data the other tools do not expose.
Read-only. Prefer the structured tools (dos2_campaign, dos2_scene, dos2_template, dos2_vignettes, dos2_notes)
when they cover the need: raw files are large. With xpath the output starts with a match count; output longer
than max_chars is truncated with a note. Fails with an error if the file does not exist in the campaign.
Inputs: file (required), campaign (required), xpath, max_chars. Returns: result
dos2_restoreRestore a backupADestructive
Undoes an earlier write: puts back the files saved in the given backup and deletes the files that the backed-up operation had created. Restoring a "full" backup brings back every file of the campaign.
The current state of the affected files is itself backed up first under the label "before-restore", so a
restore can be undone too. Fails with an error while the game process is running unless allow_running=true. Fails with an error when the backup id does not exist. Returns the id of
the before-restore backup and restored_from.
Inputs: backup (required), campaign (required), allow_running.
dos2_sceneRead a scene's contentsARead-onlyIdempotent
Reads what the Game Master has placed in one scene, from the campaign files (LevelCache): characters with name, root template, position, vitality, experience, alignment and encounter; encounters with their members; the item count; the scene's sticky notes.
Read-only, and it shows the saved state, not a running game: for the live level use dos2_live_characters. Placed
characters cannot be edited through files; change them in the game or with the dos2_live_* tools. Fails with an
error if the scene has never been loaded in the game (it has no LevelCache file yet).
Inputs: scene (required), campaign (required), limit.
dos2_scene_settingsEdit scene name, atmosphere, musicADestructiveIdempotent
Changes the settings of one scene in GMScenes.lsf: its name, folder, atmosphere (lighting and weather), ambient sound and music. Only the fields you pass change; an empty string resets that field to the level's default.
It does not change what is placed in the scene: characters and items are placed in the game or with the
dos2_live_* tools. The previous file is backed up first; undo with dos2_restore. Fails with an error while the game process is running unless allow_running=true.
Returns the backup id and the scene entry as it now reads.
Inputs: scene (required), campaign (required), name, music, +4 more.
dos2_statusServer status and campaign listARead-onlyIdempotent
Reports the server's setup and lists the GM campaigns. Returns the campaigns folder, the path to Divine.exe and whether it exists, the backups folder, whether the game process is running, and for every campaign its name, folder, UUID, add-ons, scene count and last-modified time.
Read-only, no parameters. Call it first in a session to choose a campaign and check setup: if divine_found is
false, run dos2_fetch_lslib before any other tool. For the readiness of the running game (Script Extender,
bridge mod) use dos2_live_status instead.
Inputs: no named parameters.
dos2_templateGet one template in fullARead-onlyIdempotent
Returns one saved Game Master template of the campaign in full: for an NPC its base stats, the GM's stat edits, abilities, talents, skills, skill bar and items with slots; for an item all of its attributes.
Read-only. Fails with an error when the campaign has no template with that name. Use it to inspect a template
before changing it with dos2_put_npc_template or dos2_put_item_template. To list the available names use
dos2_templates; to search across campaigns use dos2_find_templates.
Inputs: name (required), campaign (required).
dos2_templatesList saved templatesARead-onlyIdempotent
Lists the campaign's saved Game Master templates (the "Creatures and Items" panel, stored in Eggs.lsf) as short summaries. NPC entries have name, stat_name, template_id, level, alignment, skills and item stats ids; item entries have name, stats_id, template_id and level.
Read-only. Use dos2_template to get one template in full, and dos2_find_templates to search by substring across
all campaigns, including Larian's sample ones.
Inputs: campaign (required), kind. Returns: result
dos2_vignettesList vignettes in fullARead-onlyIdempotent
Returns every vignette of the campaign with its full content: uuid, title, text, question, answer options, image and folder. Vignettes are the illustrated story cards the Game Master shows to players, optionally with a vote.
Read-only. When titles are enough, dos2_campaign is cheaper. Create or change a vignette with dos2_put_vignette
and remove one with dos2_delete_vignette.
Inputs: campaign (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 34 tools
Despite 34 tools, near-collisions are explicitly disambiguated in the descriptions: dos2_status vs dos2_live_status (file setup vs running game), dos2_templates/dos2_template/dos2_find_templates (list/one/search), and dos2_bridge_install/dos2_mod_install/dos2_addon (own bridge vs own source mod vs third-party pak). The read-vs-write and file-vs-live split (dos2_scene vs dos2_live_characters, dos2_put_npc_template vs dos2_live_spawn) is also spelled out. A few pairs (dos2_campaign vs the specific readers, create-or-replace put_* tools) still require reading carefully, so not a perfect 5.
Everything is snake_case under a uniform dos2_ prefix, with recognizable sub-namespaces (dos2_live_*, dos2_put_*, dos2_delete_*). The pattern is verb_noun for mutations and bare noun for reads (dos2_campaign, dos2_notes, dos2_raw), which is systematic but means read tools have no verb, and dos2_addon/dos2_backup are verbless outliers. Minor deviations only; names remain predictable.
34 tools is heavy, but the server genuinely spans three subsystems: campaign file read/write, backup/restore, and live-game control plus mod packaging. Each tool does correspond to a real operation, yet the surface is large enough that an agent must triage setup, backup, file and live groups before acting. Borderline-heavy rather than bloated.
Coverage is strong: full CRUD for templates, vignettes and notes, campaign metadata, scene settings, journal, backup/list/restore with undo-of-undo, add-on management, and live spawn/move/set/stage/characters with a Lua escape hatch. Remaining gaps are deliberate and documented (journal is whole-file replace only, scene notes cannot be created from files, scenes/placed characters must be created in-game), which agents can work around but not eliminate.
Maintenance
Related MCP Connectors
Savecraft serves real save game data and expert game knowledge to AI assistants.
Connect any AI to your Foundry VTT world: actors, combat, dice, journals, tokens, compendiums.
D&D and TTRPG campaign manager for GMs: your AI reads and writes a live, typed campaign database.
A persistent tabletop RPG with an AI dungeon master. Agents and humans share one table.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with Foundry Virtual Tabletop, supporting reading world data, managing combat, rolling dice, and updating actor attributes via a sidecar architecture.33 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to act as co-GMs and GM assistants within Foundry Virtual Tabletop, providing tools for game mechanics, actors, tokens, combat, canvas placeables, scenes, and world management.33 npmMIT
- AlicenseAqualityBmaintenanceEnables an AI agent to act as a DM/KP in a CozyVTT campaign by narrating over chat, rolling server-authoritative dice, moving tokens, switching maps, managing initiative, and accessing character sheets through MCP.411MIT
- AlicenseBqualityBmaintenanceEnables Baldur's Gate 3 modders to look up game data across base-game and mod layers, run static lint checks on stats and progressions, test changes in a running game through the Script Extender, and export mods for Larian Toolkit/mod.io publishing. It also packs, deploys and restarts the game so mods can be iterated on without leaving the assistant.441MIT

