Skip to content

Releases: timoinglin/wow-server-mcp

v1.4.3 — Fix find_orphan_refs self-join column ambiguity

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

When source_table === target_table (e.g. quest_template.PrevQuestId → quest_template.Id), bare column references in the user-supplied WHERE clause were ambiguous because both s and t aliases expose every column. MySQL returned Column 'X' in where clause is ambiguous.

Fix: auto-prefix bare column identifiers with s. when a self-join is detected. Already-qualified columns (s.Foo, t.Foo), SQL keywords, quoted string literals, and alias prefixes (the t in t.Title) are left untouched.

This makes the natural usage just work:

find_orphan_refs(
  source_table='quest_template',
  source_column='PrevQuestId',
  target_table='quest_template',
  target_column='Id',
  where='PrevQuestId > 0'   # auto-prefixed to s.`PrevQuestId`
)

If you need to reference a target-table column instead, qualify it explicitly with t.colname.

Upgrade

cd wow-server-mcp
git pull && npm install && npm run build

Restart your AI client.

v1.4.2 — Fix get_smart_scripts LIMIT binding

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

mysql2's prepared-statement protocol rejects numeric placeholders for LIMIT on some MySQL server versions (MySQL 8.x in this case) with the error Incorrect arguments to mysqld_stmt_execute. Inlined the limit value (already validated by zod min(1).max(500)) instead of binding it.

Spotted on EmuCoach MoP Premium 7.1's MySQL 8.x server during smoke testing of v1.4.1.

Upgrade

cd wow-server-mcp
git pull && npm install && npm run build

Restart your AI client.

v1.4.1 — Patch: smart_scripts schema compat + loot summary wording

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

Two patch-grade fixes caught by smoke-testing v1.4.0 against a live EmuCoach MoP Premium 7.1 database:

  • get_smart_scripts queried a target_param4 column that exists on TrinityCore 3.3.5 but not on SkyFire MoP / Cata. Replaced the explicit column list with SELECT * (rows are small and now schema-agnostic) and made the p4= print conditional on row.event_param4 being defined.
  • inspect_loot_table summary self-contradicted on tables where every row was broken (Ordos's creature_loot_template, etc.) — it claimed "the table still produces valid drops from the other 0 row(s)". Rewrote the summary branch so a fully-broken table now reports ALL N row(s) are broken — this loot table produces NOTHING in-game. and the mixed case reports N of M rows still produce valid drops.

No new tools, no API changes. Pure correctness fixes.

Upgrade

cd wow-server-mcp
git pull
npm install
npm run build

Then restart your AI client to reload the MCP server.

v1.4.0 — Forensic / DB-integrity tools

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

Summary

Six new MCP tools focused on the "is this actually a bug?" verification workflow that comes up constantly when auditing repack databases. Each one combines several raw db_query calls into a single focused inspection and surfaces the patterns that most often produce false positives when bug-hunting.

New tools

  • inspect_creature(entry) — single deep-dive: template (with ScriptName + AIName), quest starter/ender, vendor count, smart_scripts summary, spawn count, loot table summary. Warns when SmartAI gossip handlers coexist with a gossip_menu_id.
  • inspect_gossip_chain(menu_id) — full gossip trace: row + options + per-option action_menu_id status (exists / missing / GOSSIP_OPTION_* sentinel like 1048576 = battlefield queue) + all NPCs using the menu + cross-referenced SmartAI event 62/64 handlers.
  • get_smart_scripts(entryorguid, source_type=0) — first-class SmartAI access with human-readable event_type / action_type names. Flags gossip handlers up front.
  • find_orphan_refs(source_table, source_column, target_table, target_column, where?, exclude_sentinels?) — generic FK-integrity sweep. Auto-excludes gossip option sentinels when scanning action_menu_id. Returns count + sample rows + reproducible SQL.
  • check_scriptname(name) — greps the configured worldserver core source tree (new config field core_source_path) for a ScriptName. Returns file:line hits or a "not in upstream — may be in modified core" warning.
  • inspect_loot_table(table, entry) — classifies each loot row as valid item / currency (negative ID) / reference / missing. Prevents "drops nothing" misframings on tables that actually have a mix of working and broken rows.

New documentation

  • docs/BUGHUNT.md — anti-false-positive playbook codifying lessons from a live audit session:
    • Negative item IDs are currencies, not missing items
    • GOSSIP_OPTION_* sentinels (1048576 = BATTLEFIELD, 2097152 = AUCTIONEER, etc.) are not menu IDs
    • SmartAI event 62 / 64 bypasses missing gossip_menu rows
    • ScriptName implies C++ handling — verify before claiming DB-level breakage
    • Don't cherry-pick evidence rows
    • Mark UNVERIFIED rather than file on a hunch
  • Includes pre-built find_orphan_refs sweep recipes for the most productive integrity audits.

Config

New optional field in config.json:

{
  "core_source_path": "C:/path/to/your/SkyFire_or_TrinityCore/checkout"
}

Required for check_scriptname. When unset, that tool returns a clear "not configured" message instead of erroring; the other five tools work without it.

Upgrade

cd wow-server-mcp
git pull
npm install
npm run build

Then restart your AI client to load the new code.

Tool count

76 → 82 total tools.

v1.3.3

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

🔒 Security

  • Hardened create_db_backupmysqldump is now spawned with an argv array (no shell), the MySQL password is passed via the MYSQL_PWD env var so it's no longer visible in tasklist/ps, and table/database names are validated as identifiers before being passed in.
  • Locked down update_config — the tool can no longer rewrite the config_files section. Without this, an agent could repoint worldserver_conf to any path and then write to it via write_server_config. Edit config.json directly to change those paths.
  • Redact passwords in RA echoescreate_account and set_account_password no longer surface the plaintext password through RA command echoes back to the agent.

🐛 Fixes

  • Fixed dead schemaOverride config (the headline v1.3.0 feature actually does something now). index.ts was calling initializeSchema() with no argument, so the override file was never loaded. The override is now read from config.schemaOverride and merged on top of the default MoP schema. Per-table deep merge so partial overrides (e.g. just account.dp) no longer wipe the other columns in that table.
  • Fixed creature (spawn) schemaget_creature_spawns now goes through the schema resolver instead of hard-coding id, and discover_schema detects whether your core uses creature.id (MoP/Cata) or creature.id1 (TC 3.3.5 / AzerothCore).
  • Fixed add_dp race condition — the previous SELECT-then-UPDATE pattern lost concurrent updates. Now uses a single atomic UPDATE … SET dp = dp + ?.

🧹 Cleanups

  • Removed dead player_name parameter from spawn_creature — the parameter was accepted but its value was ignored. RA has no per-call player context.
  • Schema resolver footgun fix — tool handlers now call getSchema() per-invocation instead of capturing it at registration time. This means a future reload_schema tool would actually work.
  • example.config.json now ships with schemaOverride pre-set to schema_override.json, so the post-discover_schema flow works out of the box.

📝 Documentation

  • Rewrote the Add to Your AI Client section with clear, copy-paste install blocks for Claude Desktop, Claude Code (VS Code extension + CLI), Codex CLI, and Antigravity (UI flow first, JSON config as fallback).
  • Removed the inline changelog (release notes now live here on the Releases page).
  • Fixed the Lookup & Editing tool count (10 → 13). Total is still 76.
  • Tightened the Dynamic Schema section now that the override flow actually works.

🛠️ Build / repo hygiene

  • Added .github/workflows/build.yml — type-check + build matrix on Node 18 / 20 / 22 for every push and PR to main.
  • .gitignore now covers .mcp.json, .claude/, .vscode/mcp.json (per-developer MCP client wiring with user-specific absolute paths).

v1.3.1 was intentionally skipped between v1.3.0 and v1.3.2.

Full diff: v1.3.2...v1.3.3

v1.3.2 - WoW Server MCP Rebrand

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

Renamed the project from emucoach-mcp to wow-server-mcp and updated all internal references.

v1.3.0 - The 'Universal Expansion' Update 🚀

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

v1.3.0 - The 'Universal Expansion' Update 🚀

This major release introduces the Dynamic Schema Mapping system, transforming the Emucoach MCP into a truly expansion-proof management suite.

Key Highlights:

  • 🛠️ Intelligent Schema Discovery: New discover_schema tool scans your connected world/auth databases to auto-generate a schema_override.json tailored to your repack (WotLK, Cata, MoP, Legion, etc.).
  • ♻️ Universal Compatibility: All 76 development tools (NPCs, Quests, Loot, Accounts, Lookup) now use a dynamic resolver to match your specific database columns.
  • ⚙️ Refining the Core: Improved deep-merge logic in the schema loader ensures robust configuration handling.
  • 📝 Enhanced Documentation: Updated README with 5-step instructions for custom repack integration.

The MCP is no longer locked to a single version—it now grows with your server!

v1.2.1

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

Fixes for column mismatches in quest and development tools

v1.2.0 — Schema Fixes & Improved README

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

What's New

🐛 Bug Fixes

  • Fixed LIMIT ? in prepared statements — incompatible with older MySQL versions (13 queries across 3 files)

  • Fixed reserved keyword escaping for rank, type, Type columns

  • Fixed spell_dbc schema mismatch (Comment instead of SpellName1)

  • Fixed game_event schema mismatch (eventEntry instead of entry)

📝 Improvements

  • New "Why MCP Instead of Raw Credentials?" section in README

  • Added version, MCP, Node.js, and TypeScript badges

  • Added "Updating from an Older Release" section

  • Improved capabilities overview with comparison table

✅ Verified

All 75 tools tested and verified operational against Emucoach MoP Premium v7.0.

Full Changelog: v1.1.0...v1.2.0

Repack Development Suite

Choose a tag to compare

@timoinglin timoinglin released this 18 Jul 09:09

🧰 Repack Development Suite

This release transforms emucoach-mcp from a server management tool into a full repack development suite — enabling AI agents to create NPCs, build questlines, edit loot tables, and more, all through natural language.

⚡ Speed Improvements

  • Persistent RA session — login handshake happens once per session instead of per command (~80% faster RA calls)

  • Parallel DB statsget_db_stats now queries all 3 databases concurrently

  • Larger connection pool — MySQL pool size increased from 5 → 10

🐉 NPC Development (13 new tools)

Spawn creatures, clone NPC templates, manage vendor inventories, set gossip menus, configure waypoint patrol paths, and set NPC flags — all without touching the DB manually.

📜 Quest Development (7 new tools)

Create quests from scratch, assign quest giver and ender NPCs (with automatic flag management), remove relations, and inspect quest rewards.

💎 Loot & World Data (8 new tools)

Add/remove items from creature loot tables, search which mobs drop a specific item, inspect item container loot, search spells from spell_dbc, list world events, and find teleport location coordinates.

📊 Total: 72 tools (was 44)

Full tool list in the README.