MCP server for EQEmu — C++ source search, quest API, database, NPC/item/spawn/loot management, documentation
37 tools with consistent naming (verb_noun pattern), clear descriptions (avg 150-200 chars), and explicit JSON schemas. All tools have input schemas with typed parameters and descriptions. However, output schemas are undocumented (no return type specs), error handling lacks recovery guidance, and several tools lack parameter constraints (enums, ranges). Descriptions are functional but generic, many lack WHEN/WHY context or dependency hints. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Composition is sound: tools are single-purpose and chainable via ID returns.
Add an item to an NPC's loot table. Creates the loot chain if needed.
Add an item to a merchant's inventory.
Create a new NPC in the npc_types table.
Create a new spawn point for an NPC in a zone. Creates a spawngroup, spawnentry, and spawn2 record.
Delete a quest script file.
Delete a spawn2 entry and its orphaned spawngroup/spawnentry if no other spawn2 uses it.
Get column definitions for a database table.
No output schemas documented. Tools return unstructured strings or inferred objects without field definitions. LLMs cannot plan downstream calls or extract structured data reliably.
Missing tool annotations. Tools marked DESTRUCTIVE (run_write_query, delete_spawn, delete_quest_file) and READ_ONLY lack explicit readOnlyHint/destructiveHint annotations in schema. Agents cannot distinguish safe from risky tools without reading descriptions.
No parameter constraints (enums, ranges). search_npcs accepts min_level/max_level with no bounds; search_items accepts item_type=-1 with no enum; search_recipes accepts skill ID with no valid range. LLMs can pass invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 79 | 2026-07-28+ | v2 |
Look up account details and all associated characters/IPs. Useful for admin investigation. Provide either account_name or character_name.
Get detailed character info including inventory summary, AAs, skills, and zone.
Get full details for an item by ID.
Get items sold by a merchant.
Get full details for an NPC by ID.
Get the full loot chain for an NPC: loottable -> lootdrop -> items.
List characters that are likely online (logged in recently).
Get quest API documentation for a specific class or topic. Returns method signatures, event documentation, and usage examples from the official EQEmu docs.
Get quest API methods for a class.
Get full recipe details including all components and results.
Get the full schema documentation for a database table. Returns column definitions with descriptions, data types, relationships, and ER diagrams from the official EQEmu docs.
Get all spawn points in a zone with their NPCs.
List all top-level documentation sections and their subsections.
List all Lua/Perl quest API classes with method counts.
List quest script files in a zone.
List all zone directories containing quest scripts.
List all documented database tables, optionally filtered by category.
List all tables in the PEQ database.
Read a specific documentation page by path.
Read a quest script file.
Run a read-only SQL query. Only SELECT, SHOW, DESCRIBE, and EXPLAIN are allowed.
Execute a write SQL query (INSERT, UPDATE, DELETE). USE WITH CAUTION. This modifies the live database.
Search the EQEmu documentation (docs.eqemu.io) for a topic. Searches across all doc pages including quest API, server operations, database schema, configuration, NPC guides, item references, etc.
Search items by name, type, or required level.
Search NPCs by name, zone, or level range.
Search quest scripts using ripgrep.
Search tradeskill recipes by name, component item, or tradeskill type.
Show FK relationships for a table.
Update fields on an existing NPC.
Create or overwrite a quest script file.
Error handling lacks recovery guidance. No documented error cases, retryability, or next-step hints. E.g., run_query returns 'Error: only SELECT...' but does not suggest alternatives or how to fix the query.
Descriptions lack WHEN/WHY context and dependency hints. E.g., 'Search NPCs by name, zone, or level range' does not explain when to call this vs get_npc, or that zone must be a short name. Descriptions are functional but not LLM-optimized.