bg3-data-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BG3_DIVINE | No | Path to LSLib's Divine.exe. Discovered from PATH and common folders when omitted. | |
| BG3_DATA_CACHE | No | Overrides the SQLite index cache directory. Defaults to %LOCALAPPDATA%\bg3-data-mcp\cache (Windows) or ~/.cache/bg3-data-mcp/cache (WSL). | |
| UV_PROJECT_ENVIRONMENT | No | Directory for the uv-managed virtual environment (used e.g. under WSL to keep the environment on the Linux filesystem). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| bg3_layersA | List data layers in load order with source timestamps and entry counts. |
| bg3_refreshA | Re-index layers whose sources changed. force: a layer name, or 'all', to rebuild regardless. |
| bg3_add_mod_layerB | Register a mod layer: an unpacked mod folder (containing Public/ and Mods/) or a .pak file. position: 1-based slot among mod layers (default: on top). The layer is indexed immediately. |
| bg3_remove_mod_layerB | Unregister a mod layer (base cannot be removed). |
| bg3_get_entryB | Resolve a stats entry (spell, status, passive, character, object, weapon, ...) through inheritance
across the selected layers. Shows the |
| bg3_searchB | Find stats entries whose name or any field contains |
| bg3_referencesC | Everything that mentions |
| bg3_diffC | What |
| bg3_locaC | Look up a localization handle (e.g. h1a950eaag...), or search localized text. |
| bg3_templateC | Resolve a root template (MapKey GUID or Name) through its ParentTemplateId chain. |
| bg3_progressionC | Progression nodes for a class/subclass (Name, e.g. 'Soulknife', or TableUUID), merged by node UUID so a higher layer's node replaces a lower one's. |
| bg3_staticB | Static game data by UUID or Name (highest layer wins): kind = ClassDescription (classes/subclasses, with ProgressionTableUUID), LevelMapSeries (e.g. SuperiorityDie, per-level values), ActionResourceDefinition (resources: MaxValue, ReplenishType), Feat. A partial key lists matches. |
| bg3_spell_listC | A spell/passive/skill list by UUID or Name (highest layer wins). |
| bg3_spell_visualsC | The visual/audio kit of a spell: effects, animations, sounds, icon - for reusing vanilla VFX. |
| bg3_similar_spellsB | Spells matching damage type / school / spell type (Target, Projectile, Shout, Zone...) / level / name keyword, with their visual kits - to borrow effects and animations for new spells. |
| bg3_effectC | Resolve an effect GUID: a MultiEffectInfo (the value of stats *Effect fields) with its component effect resources (names, bones, duration, looping, .lsfx file), or a single effect resource. Also lists the stats entries that use it. |
| bg3_search_effectsA | Find effects by what they're called (e.g. 'Necrotic', 'Impact_BodyFX', 'Radiant_Beam'): MultiEffectInfos whose name, or any component effect's name, matches. Returns the GUID to put in a stats *Effect field, what matched, and sample spells/statuses already using it. |
| bg3_se_statusA | Is the game running, which Script Extender log belongs to this run, and the latest game state. |
| bg3_se_evalA | Run Lua inside the RUNNING game via Script Extender and return its printed output plus the return value (JSON). context: 'server' (game logic, Osi.*, Ext.Stats) or 'client' (UI/visuals). delay: seconds to wait first (e.g. for a cast or boost to resolve). The test harness, once staged, is available as the global BG3T. This executes code in the user's live game session. |
| bg3_se_commandB | Send one Script Extender console line to the running game (e.g. '!apofeature Barbarian_PersistentRage')
and return the log lines it produced within |
| bg3_se_logB | Tail the current game run's Script Extender runtime log, optionally only lines containing |
| bg3_se_live_entryB | Ground truth: compare a stats entry as the running game actually loaded it with the index's
resolution for |
| bg3_se_hot_loadA | HOT-LOAD a mod layer into the RUNNING game without restarting: mirrors its stats .txt files as loose files under /Data/Public/BG3DataHot_/, loads them with Ext.Stats.LoadStatsFile(…, true) (overwriting existing entries), Syncs every entry to the client, and (loca=True) pushes its English strings. files: only these stats files (e.g. ['Passive.txt']). Progressions/lists/templates can't be hot-loaded (restart with a pak). Test-only: don't save the game while relying on hot-loaded entries. Clean up with bg3_se_hot_clean. |
| bg3_se_hot_cleanA | Remove the loose hot-load folders (Data/Public/BG3DataHot_*) from the game install. Entries already hot-loaded stay in the running session until restart. |
| bg3_se_reset_luaA | Reload Script Extender Lua (console |
| bg3_environmentB | What this machine looks like to bg3-data: Windows or WSL, the discovered game install (Steam library, GOG or configured), game exe, Divine.exe, the Larian user folder (Mods, modsettings.lsx, Script Extender logs), Script Extender presence, detected mod managers (Vortex, BG3 Mod Manager, in-game) and what they mean for hand-deployed paks, and each mod layer's deploy/enable state. |
| bg3_deployA | Pack a mod layer (Mods/ + Public/, via Divine), deploy the pak to the user Mods folder (refused while the game runs; previous pak backed up) and enable it in the active profile's modsettings.lsx after its dependencies. Works for any mod; no per-mod scripts. Re-run after a mod manager rewrites the load order. |
| bg3_game_restartA | Kill the game, optionally deploy a mod layer (its layers.json |
| bg3_level_upA | Grant the host exactly enough XP (from the layers' XPData) to reach |
| bg3_level_checkB | Compare the host with its class/subclass progressions up to its current level: passives added and removed, AddSpells lists (with the spell's source), ActionResource boosts, and this level's choices. |
| bg3_test_listC | Test cases a mod layer defines (TOML under /tests/bg3, or layers.json |
| bg3_test_scriptC | Write the human test script (step-by-step reading script per level and case) to /docs/test-scripts/ and return it. |
| bg3_test_stageB | Set up one test case in the running game: preconditions (class level, spell learned through the class, not in combat), spawns, HP/status setup, host-first initiative, safety watch, event recorder. mode="script" cases are cast immediately. Then the user acts; finish with bg3_test_verify. |
| bg3_test_verifyB | Evaluate the staged case's expectations (before/after snapshots + recorded events), report PASS/FAIL per check with its fidelity, then remove every spawn, test boost and applied status. |
| bg3_test_runA | Run one auto/script case end to end: stage (real combat, host acts first), scripted cast, verify, cleanup. Effects come from recorded events; costs are checked against the spell's loaded UseCosts (a scripted cast never charges them). player-mode cases need bg3_test_stage + a hotbar cast instead. |
| bg3_test_run_levelB | Run every automated case for a level, one after another, and summarise: the cases assigned to
|
| bg3_lint_statsB | Static stats lint for a mod layer, before the game ever loads it: enum values (Cooldown, StatsFunctorContext, RemoveEvents, SpellFlags, TickType...) and functor/condition/boost names that no other layer uses (the engine silently drops what it doesn't know), plus missing referenced entries (statuses, unlocked spells/interrupts, using, containers) and unknown action resources. |
| bg3_lint_progressionsB | Static progression checks for a mod layer: invalid node UUIDs (the game silently drops those nodes), selectors referencing lists no layer defines, and same table+level nodes from different layers (both load, so their choices/feats stack). |
| bg3_test_planB | The step-by-step plan for a test build ([[build]] in the suite TOML): for every level the exact level-up choices (subclass, which spells, feat), chosen so every spell a test needs is learned by its test level, plus the tests that run there. Written to /docs/test-scripts/plan-.md. |
| bg3_test_cleanupA | Remove every test spawn, boost (tag BG3Test) and applied status, and stop recording. |
| bg3_ingame_checkB | Compare EVERY stats entry a mod layer defines with what the running game loaded (the engine drops
invalid values silently). |
| bg3_toolkit_statusB | Where the Larian Toolkit expects this mod (Data/Projects, Mods, Public, Editor/Mods): present or missing, linked to the repo or a separate copy, file counts, and the meta.lsx version (mod.io readiness). |
| bg3_toolkit_checkB | Compare the mod's Toolkit editor copy (dest='toolkit': /Data/Editor/Mods/; 'repo': /Editor/Mods/) with an export of its game-ready files: missing/extra objects and differing fields per file. Run before publishing; 0 problems = both copies say the same. |
| bg3_toolkit_exportA | Generate the Toolkit editor copy (.stats for stats, .tbl for lists/progressions/resources/classes/ level maps/feats) from the mod's game-ready files. Existing editor UUIDs are kept. write=False is a dry run listing files, object counts and warnings; write=True writes them (dest 'toolkit' or 'repo'). Close the Toolkit first: it overwrites files it has open. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 44 tools
Many tools are clearly distinct by context (layer management vs. runtime Script Extender vs. toolkit vs. tests), but several pairs overlap: bg3_ingame_check/bg3_se_live_entry both compare indexed vs. loaded data, bg3_search/bg3_search_effects/bg3_references/bg3_static all search different facets, and bg3_get_entry/bg3_diff both resolve entries. Descriptions help, but with 44 tools an agent faces real misselection risk.
All tools use the bg3_ prefix and snake_case, making them predictable and visually cohesive. However, the verb_noun pattern is not strict: many tools are noun-only (bg3_layers, bg3_environment, bg3_static, bg3_progression) while others use verbs (bg3_get_entry, bg3_search_effects), a minor deviation.
At 44 tools, the surface is far above the typical well-scoped range of 3-15 and even beyond the 25+ threshold that the rubric treats as too many. Although BG3 modding is a complex domain, the sheer count—driven by many specialized test, runtime, and toolkit operations—creates a heavy cognitive load and higher likelihood of tool selection errors.
The surface covers a broad lifecycle: layer add/remove/list/refresh, stats and effect search/resolution, runtime Script Extender interaction, hot-loading, automated and scripted testing, linting, toolkit export/check, deployment, and environment discovery. Gaps are minor—for example, there is no direct stats-entry editing or file mutation tool, but the inspection/test/deploy focus appears intentional and workable.