crabsmadethis/d2r-horadric-tools
This server provides 23 tools for working with Diablo II: Resurrected save files, item data, character generation, and data mod pipelines.
Lookup & Search
Look up unique items, set items, base items, runewords, stats, and skills by name or ID
Search across all item types in a single query (up to 20 tagged results)
Save File Inspection & Validation
Scan
.d2ssave files for errors, warnings, checksum/size status, and item countsInspect and summarize a save file (class, level, stats, progression, mercenary info)
List items in a save, optionally filtered by location (equipped, inventory, stash, cube, merc)
Diff two
.d2sfiles to compare structural differences
Character Generation
List characters defined in YAML files
Validate character YAML configs with optional dry-run binary builds
Build and deploy characters from YAML to the live saves directory, with automatic backup and scanner gate
Import existing
.d2ssaves back into character YAML definitions
Data Mod Pipeline
Build mods from vanilla data, overlays, and scripts
Deploy mods to the game folder (including CASC injection) or undeploy to revert to vanilla
Diff vanilla vs. build tables to identify changes
Extract vanilla data from the CASC archive
Clean build artifacts
Run a full recovery pipeline (extract → build → deploy) in one step
Audit vanilla skills and items, generating markdown reports
Officially supported platform; the toolset auto-detects game path on Linux and provides full functionality including CASC read/write.
Supports running Diablo II: Resurrected modding tools under Proton on Steam Deck, including auto-detection of game path.
The MCP server is implemented in Python and requires Python 3.10+; integration is via pip install and python -m d2r_mcp.
Integrates with Steam to auto-detect Diablo II: Resurrected installation path and deploy mods to the game directory.
Provides support and auto-detection for Diablo II: Resurrected on Steam Deck (Proton), enabling modding and character building on the device.
Uses YAML for character definitions, data mod overlays, and JSON string patches; the MCP server exposes these YAML-driven workflows as tools.
Horadric Tools for Diablo II: Resurrected
Horadric Tools is a Python/MCP toolkit for offline Diablo II: Resurrected save and
data-mod workflows. It builds .d2s characters from YAML, scans save files
before they are loaded, builds data mods for single player, and exposes
the same capabilities through an MCP server.
The repository is Linux / Steam Deck first. Windows path detection exists but needs more testing. The repo does not ship Blizzard game data, private save files, or Battle.net automation.
Toolkit Scope
Horadric Tools provides:
d2r-chargen: YAML-to-.d2scharacter generation, import, diff, validation, and scanning.d2r-mod: local data extraction, overlay builds, JSON string patches, CASC deploy helpers, diffs, audits, and cleanup commands.d2r_mcp: 23 MCP tools for lookup, save inspection, character generation, and mod-pipeline automation.Public diagnostics in
tools/for corpus scans, follower payload inspection, model-row comparison, and repo hygiene checks.A shareable external-corpus scan wrapper at
scripts/merc_status_external_scan.shfor the merc-status open question (aggregate-only JSON; no paths or per-file examples).
Character generation currently covers equipment, runewords, charms, stats,
skills, mercenary gear, Iron Golems, and experimental template-derived bound
demons. Bound-demon template recipes are documented in
docs/bound-demon-template-recipes.md;
they keep source affixes separate from Bind Demon skill affixes and do not
treat template-derived support as arbitrary algorithmic synthesis. A narrow
registry-backed synthesis_validated surface is also available for exact
validated packages; list those ids with d2r-chargen bound-demon-packages.
Related MCP server: LoreKeeper MCP
Non-Goals
Online play, ladder play, or Battle.net automation.
Trainers, bots, maphacks, or live memory editors.
Committed extracted D2R data, raw save corpora, or machine-local fixtures.
Loading generated saves without first running the scanner.
For .d2s work, the expected loop is: write to staging, recompute size and
checksum, scan, then promote only scanner-clean output.
Quickstart
git clone https://github.com/crabsmadethis/d2r-horadric-tools.git
cd d2r-horadric-tools
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"Generate local lookup data from your D2R install:
d2r-mod extractIf the install is not auto-detected:
d2r-mod extract --game-dir "/path/to/Diablo II Resurrected"Validate the included example character:
d2r-chargen validate ExamplePaladinBuild it only when your save directory is configured and you are ready to write the generated save:
d2r-chargen build ExamplePaladin --force
d2r-chargen scan ExamplePaladinD2R caches saves at startup, so fully exit and relaunch the game after changing a local save file.
Character YAML
The tracked chars/ directory contains curated examples only. Keep disposable
or validation-specific character drafts outside the repo and point the tools at
them with D2R_CHARS=/path/to/chars.
schema_version: 1
name: ExamplePaladin
class: paladin
level: 85
progression: hell_complete
stats:
strength: 156
dexterity: 125
vitality: 250
energy: 25
skills:
Blessed Hammer: 20
Concentration: 20
Vigor: 20
equipment:
- slot: helm
unique: Harlequin Crest
- slot: body
runeword: Enigma
base: utp
- slot: weapon
runeword: Heart of the Oak
base: fla
inventory:
charms:
- magic_grand_charm:
count: 8
properties:
skill_tab: [1, 15]
life: 40See chars/ExamplePaladin.yaml for a fuller example.
Iron Golem payloads are authored with an iron_golem: block on Necromancers
that have IronGolem learned. The supported public surface includes normal,
magic, ethereal, set, rare, crafted, socketed-normal, and runeword payloads.
Runeword golems are written as a JM-less parent followed by generated rune
filler records inside the golem block. Unique payloads require explicit
canonicalization opt-in because D2R rewrites some bytes on save/exit. Manual
Iron Golem socket filler authoring and broad jewel-filler authoring remain
gated; character stash_items expose only the narrow live-positive normal
parent shape with one magic jew or validated unique cjw filler.
class: necromancer
skills:
IronGolem: 1
iron_golem:
item:
runeword: Insight
base: 7wcSupported class names:
amazon, sorceress, necromancer, paladin, barbarian, druid, assassin, warlockCommon equipment slots:
helm, body, weapon, shield, hands, belt, feet, neck, ring_right, ring_left,
weapon_switch, shield_switchCLI Reference
d2r-chargen
d2r-chargen list
d2r-chargen validate <name> [--yaml-only]
d2r-chargen build <name> [--phase N] [--force]
d2r-chargen scan <name>
d2r-chargen import <name> [--force]
d2r-chargen diff <file1> <file2>
d2r-chargen bound-demon-packages [--json] [--all]validate checks YAML and binary encoding without writing a save, including
bound-demon and Iron Golem payloads when the YAML requests them. build writes
through the safety pipeline and should be followed by scan before the result
is loaded in game.
For bound demons, normal reusable authoring should use template_path or a
listed synthesis_validated package id. Raw context slices, generated-name
requests, aura-choice requests, pcount/stat knobs, and algorithmic
monster: NAME synthesis fail before any save is written unless a validated
package explicitly owns that behavior.
Bound-demon template workflow:
python3 tools/d2s_demon_template_inspect.py <template.d2s>
python3 tools/d2s_demon_template_inspect.py <template.d2s> \
--extract-payload .local-demon-templates/<template>.bin \
--emit-yaml-snippetThe emitted YAML snippet is preserve-only. It names template_path and the
payload row index, but does not add source or skill affix edits. Put character
drafts and extracted templates outside the repo:
export D2R_CHARS=/path/to/local/chars
export D2R_SAVES=/path/to/offline-saves
d2r-chargen validate MyWarlock
d2r-chargen build MyWarlock --force
d2r-chargen scan MyWarlockThe public template catalog currently documents Black Lancer, Mauler, Lister-style/Baal Subject 5, and Hephasto-family entries in docs/bound-demon-template-recipes.md.
stash_items can also build the narrow socketed-normal parent shape that has
passed Offline validation: exactly one magic jew filler, or the validated
unique Guardian's Thunder cjw, under a normal parent. Broader jewel
families and socketed magic/rare parents are still research-gated.
stash_items:
- normal: true
base: flc
socketed: true
num_sockets: 1
socket_fillers:
- base: jew
magic: true
properties:
fire_res: 5Normal stash_items may also carry explicit stack quantities for misc and
quest-style bases that use the D2R quantity field. This is fixture-backed for
representative tokens, essences, keys, Worldstone shards, and tomes; live
validation should still be run before promising a new quest-item family.
stash_items:
- normal: true
base: toa
quantity: 1
- normal: true
base: pk1
quantity: 4
- normal: true
base: tbk
quantity: 20d2r-mod
d2r-mod extract [--game-dir PATH]
d2r-mod build [--no-regen]
d2r-mod deploy [--force] [--no-casc]
d2r-mod undeploy
d2r-mod diff [--summary]
d2r-mod inject [--from-dir PATH]
d2r-mod audit [--skills] [--items]
d2r-mod clean
d2r-mod updateCommands that read or write game data need a detected D2R install or an
explicit --game-dir / D2R_GAME_DIR.
Data Mod Overlays
Overlays modify D2R data tables declaratively. Place overlay files in
overlays/ and run d2r-mod build.
target: data/global/excel/UniqueItems.txt
changes:
- row: {index: "The Gnasher"}
set:
prop4: "dmg%"
min4: "50"
max4: "50"
comment: "Buff The Gnasher with +50% Enhanced Damage"If no overlays/ directory exists, the build proceeds with vanilla data only.
See examples/sample_overlay.yaml for a complete
example.
JSON String Patches
D2R reads most item, mercenary, and UI strings from JSON files under
data/local/lng/strings/. Put YAML specs in patches/json_strings/ to add or
override strings:
description: "Rename a few potions"
target: item-names.json
entries:
- key: "vps"
value: "Wild Rice Cake"
- key: "MyCustomItem"
value: "Heart of the Mountain"After d2r-mod build, patched JSON files are written to
build/data/local/lng/strings/. D2R caches strings at startup, so fully exit
and relaunch to see changes.
MCP Server
Horadric Tools ships an MCP server with 23 tools across lookup, save inspection, chargen, and mod-pipeline categories.
Install the package and the MCP SDK before launching the server:
pip install -e .
pip install mcpLaunch it with:
python3 -m d2r_mcpClaude Code:
claude mcp add d2r-tools --transport stdio --scope user -- python3 -m d2r_mcpGeneric MCP config:
{
"mcpServers": {
"d2r-tools": {
"command": "python3",
"args": ["-m", "d2r_mcp"],
"env": {}
}
}
}See d2r_mcp/README.md for the full tool catalog and safety notes.
Safety Model
The save-file workflow is intentionally conservative:
Back up the target save family before writing.
Start from an existing valid
.d2stemplate when possible.Write changes to a temp or staging file.
Recompute size and checksum.
Run
d2r-chargen scan <name>.Promote only scanner-clean files.
Scanner hard errors are deployment blockers unless there is bit-level evidence that the scanner is wrong. Detailed save-format notes live in docs/d2s_format.md.
Repository Map
d2r_chargen/ Character YAML parser, save writer, scanner, importer, diff
d2r_mod/ Data extraction, overlays, CASC read/write, deploy pipeline
d2r_mcp/ MCP server, tool wrappers, response envelope, MCP docs
chars/ Curated example character YAML
examples/ Public overlay examples
docs/ Save-format notes, validation docs, public research writeups
tools/ Standalone diagnostics, corpus tools, hygiene checks
plugin/ Optional Claude Code plugin commands
tests/ Unit, MCP, scanner, mod-pipeline, and fixture-gated testsGenerated data, build output, local evidence, and extracted game files should stay untracked.
Platform Support
Platform | Status |
Linux / Steam Deck (Proton) | Supported, tested |
Windows | Path detection included, needs more testing |
macOS | Unsupported for playing D2R; useful for docs and code work only |
Requirements
Python 3.11+
PyYAML, installed by the package
Diablo II: Resurrected for data extraction and live game use
MCP SDK for MCP server use (
pip install mcp)
Contributing
Start with CONTRIBUTING.md. Before opening a PR, run:
python tools/public_hygiene_check.py
ruff check .
pytest tests/ -v --timeout=60 \
-m "not integration and not slow and not e2e and not smoke" \
--ignore=tests/fixtures/ \
--ignore=tests/test_chargen.py \
--ignore=tests/test_decoder.py \
--ignore=tests/test_fixtures.py \
--ignore=tests/test_importer.pyLicense
MIT
Available Tools
23 toolsd2r_chargen_buildA
Build and deploy a character to the live saves directory.
Structurally enforces CLAUDE.md rules #3, #4, #10, #17: backs up the live save, builds to a temp file, runs the scanner on the temp, and only promotes the temp to the live save if the scanner passes. Live save is untouched on scanner failure.
Args: name: Character name (chars/.yaml must exist). phase: Deploy through phase (1-4). Default: full deploy (4). force: Skip the freshness gate (discards server progress). Avoid unless intentional.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| phase | No | ||
| force | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: enforces CLAUDE.md rules, backs up live save, builds to temp, runs scanner, promotes only on success. It warns about the 'force' parameter discarding server progress and states that live save is untouched on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: four sentences plus parameter bullets. It front-loads the main purpose, and every sentence adds value—no unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers the tool's behavior (deployment process, safety, parameters) well. It lacks explicit mention of the return value, but the outcome (successful promotion or not) is implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain parameters. It does so thoroughly: 'name' requires an existing file, 'phase' defaults to full deploy (4), 'force' skips freshness gate with a warning. This adds meaning beyond the schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Build and deploy a character to the live saves directory.' It uses specific verbs and resources, and distinguishes from sibling tools (e.g., import, list, validate) by focusing on deployment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when to use the tool (e.g., deploying a character to live saves) and explains the safety process (backup, temp build, scanner). However, it does not explicitly mention when not to use it or provide alternatives among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_chargen_importA
Import a server-synced .d2s save into chars/.yaml.
Args: name: Character name (reads live save at /.d2s). force: Overwrite an existing chars/.yaml.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| force | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It reveals that the tool reads a live save from a specific path (<SAVES>/<name>.d2s) and mentions the force parameter for overwriting. However, it does not explain the behavior when force is false (likely an error), error handling, or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, with a clear one-line purpose followed by a structured Args section. Every sentence is informative and there is no clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple import tool with 2 parameters and no output schema or annotations, the description covers the essential workflow: what is imported, from where, and the optional overwrite flag. It could mention the output format (yaml file), but overall is quite complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description adds crucial meaning: 'name' is explained as reading a live save at a specific path, and 'force' is described as overwriting an existing file. This clarifies both parameters beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Import a server-synced .d2s save into chars/<name>.yaml' with specific verb and resource. It distinguishes from sibling chargen tools like d2r_chargen_build, d2r_chargen_list, and d2r_chargen_validate, which handle other chargen operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for importing .d2s saves into yaml format, but does not explicitly state when to use this tool versus alternatives. No exclusion conditions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_chargen_listA
List character names defined in chars/*.yaml.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It only states it lists names from files, but does not mention permissions, side effects, or output format, leaving significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no wasted words. Front-loaded with action and target.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, no-parameter list tool, the description is mostly complete. However, it does not specify the exact format of the output (e.g., just names or full paths), leaving minor ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and schema coverage is 100%. The description adds value by specifying the source ('chars/*.yaml'), which is not in the schema. Baseline for 0 params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('character names defined in chars/*.yaml'), clearly distinguishing it from siblings like d2r_chargen_build or d2r_chargen_import.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The purpose is implied (simple listing), but no exclusions or context for when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_chargen_validateB
Validate a character YAML and optionally run a dry-run binary build.
Args: name: Character name (resolves to chars/.yaml). yaml_only: Skip the dry-run binary build + scanner pass.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| yaml_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations present. Description explains the primary behavior (validation) and the yaml_only flag (skips dry-run and scanner). Does not disclose side effects (likely none), API requirements, or return format, but adequate for a simple validation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: only two sentences plus bullet-point args. No redundant information. Front-loaded with core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description should clarify return values. It does not mention what the tool outputs (e.g., validation results, success/failure). For a validation tool, this is a gap. Parameters are well-described, but output is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must carry parameter information. It explains that name resolves to 'chars/<name>.yaml' and that yaml_only skips the dry-run build and scanner pass. This adds meaningful context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Validate a character YAML' with optional dry-run build. It specifies the resource (character YAML) and action, distinguishing it from siblings like d2r_chargen_build or d2r_chargen_list. However, it does not explicitly contrast with these siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like d2r_chargen_build. The description only explains parameters, not usage context or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_lookup_item_baseA
Look up a D2R base item by 3-char code or name.
Searches item_bases.py data. Returns dimensions, requirements, sockets. Supports substring matching on names.
Args: query: 3-character item code (e.g. "hax") or item name
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must detail behavior. It mentions substring matching and return fields (dimensions, requirements, sockets), which is helpful. However, it lacks clarity on case sensitivity, exact vs substring behavior for codes, and what happens when no match is found. These are gaps for a lookup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, starting with the purpose, then search method, return info, and args section. Every sentence adds value without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, output schema exists), the description covers the core aspects: what it looks up, how to query, and what it returns. It could mention error handling or edge cases, but it's largely complete for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only has a 'Query' title with 0% coverage, so the description compensates by explaining the parameter format: '3-character item code (e.g. 'hax') or item name' and gives an example. This adds significant meaning beyond the schema, though it could clarify that codes expect exact match.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Look up a D2R base item by 3-char code or name.' This specific verb-resource combination distinguishes it from sibling lookup tools that target different entities like runewords, skills, or uniques.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description implies usage for base items (by naming them), it does not explicitly state when to use this tool over alternatives or provide exclusions. For example, it doesn't say 'Use this for base items, use d2r_lookup_runeword for runewords.' The context from sibling names helps but is not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_lookup_runewordA
Look up a D2R runeword by name or numeric ID.
Searches runewords.py data. Returns runes, valid bases, stats. Supports substring matching.
Args: query: Runeword name (or substring) or numeric runeword ID
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only states basic behavior (lookup, substring matching) but omits critical details like read-only nature, error handling (e.g., no match found), or any side effects. This is insufficient for safe agent decision-making.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly concise at two sentences plus an args line, with the main purpose front-loaded. It could be more structured (e.g., bullet points) but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter) and presence of an output schema, the description sufficiently covers the input and high-level output ('Returns runes, valid bases, stats'). It does not need to elaborate further for a straightforward lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter 'query' with anyOf string/integer and no description. The description compensates by explaining that strings represent runeword names (with substring support) and integers represent numeric IDs, providing essential semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'look up' and the resource 'D2R runeword', with specifics like by name or numeric ID and substring matching. It differentiates from sibling lookup tools (e.g., d2r_lookup_item_base, d2r_lookup_skill) by specifying the resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but provides no guidance on when to use it versus alternatives like other lookup tools. Without explicit usage context, an agent must infer from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_lookup_set_itemA
Look up a D2R set item by name or numeric ID.
Searches set_items.py data. Returns item info + set membership. Supports substring matching.
Args: query: Item name (or substring) or numeric set item ID
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure. It states the tool searches a specific data source, returns item info and set membership, and supports substring matching. This adequately describes the read-only, non-destructive nature. No contradictions or missing key behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: two short paragraphs. The first states the purpose, and the second adds usage details. Every sentence provides necessary information without redundancy. Front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple interface (one parameter, output schema exists), the description sufficiently covers what the tool does, what input it expects, and what it returns. It doesn't need to detail the output schema since that is provided separately. Slight improvement could mention additional output details, but it's complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions (0% coverage), so the description must compensate. It explains the 'query' parameter accepts 'Item name (or substring) or numeric set item ID', adding significant meaning beyond the schema's anyOf type. This clearly instructs how to use the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Look up a D2R set item by name or numeric ID', specifying the exact action and resource. It distinguishes from sibling lookup tools (e.g., d2r_lookup_item_base, d2r_lookup_unique) by focusing on set items, adding details about searching 'set_items.py data' and returning 'item info + set membership'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for set item lookups via the name and context, and distinguishes from siblings by specifying 'set item'. However, it does not explicitly state when to use or avoid this tool, nor does it compare to alternatives like other lookup tools. Usage is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_lookup_skillA
Look up a D2R skill by name or numeric ID.
Searches skills.py data. Returns skill ID and class. Supports substring matching.
Args: query: Skill name (or substring) or numeric skill ID
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries burden. It discloses data source (skills.py), return fields (skill ID and class), and matching behavior (substring). Lacks details on side effects, auth, or rate limits, but adequate for a read-only lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise—two sentences plus bullet for args. No fluff, front-loaded with purpose. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return value explanation is unnecessary. Description covers data source, input flexibility, and matched output fields. Sibling tools are similar, making this sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description adds meaning: explains query can be skill name, substring, or numeric ID. Also states what is returned, compensating for schema's lack of description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'look up' and resource 'D2R skill', distinguishes from sibling tools like d2r_lookup_item_base and d2r_lookup_runeword by specifying the domain (skills).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no explicit when-to-use or when-not-to-use guidance. The mention of substring matching implies usage flexibility, but no comparison with other lookup tools or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_lookup_statA
Look up a D2R stat by ID, canonical name, or YAML alias.
Searches item_stat_cost.py data. Returns encoding info (save bits, save add, param bits, value shift) needed for binary stat encoding.
Args: query: Stat ID, canonical name (e.g. "fireresist"), or alias (e.g. "fcr")
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Mentions data source ('item_stat_cost.py') and return type ('encoding info'). Lacks disclosure of error handling or edge cases, but is adequate for a lookup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each with essential info: purpose, data source, return value, parameter details. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple tool with one param and output schema, the description covers purpose, parameter semantics, and return value. Minor gap: no example queries or mention of case sensitivity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, but description fully explains the single parameter 'query' as accepting stat ID, canonical name, or alias. Adds meaning beyond schema type (anyOf string/integer).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('Look up') and resource ('D2R stat') with clear query methods (ID, canonical name, alias). Differentiates from sibling lookup tools which target other entities (items, runewords, skills, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes when to use (lookup stat by various identifiers) and what it returns. Does not explicitly state when not to use or contrast with siblings, but the context of stat vs other entities is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_lookup_uniqueA
Look up a D2R unique item by name or numeric UID.
Searches unique_items.py data. Returns item info + stats. Supports substring matching (e.g. "harlequin" finds Harlequin Crest).
Args: query: Item name (or substring) or numeric UID
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, but description transparently explains it is a read-only lookup returning item info+stats, with substring matching. No mention of destructive actions, but clear safe usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: 3 sentences plus Args section. Front-loaded with purpose. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with one parameter, well-described. Output schema exists, so return values are covered. No missing context for an effective lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema coverage, description enriches the parameter 'query' by explaining it can be name or numeric UID, supports substring matching, and gives an example ('harlequin' finds Harlequin Crest).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it looks up D2R unique items by name or UID, specifies data source (unique_items.py), and mentions substring matching. Distinguished from siblings like d2r_lookup_runeword and d2r_lookup_set_item.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on how to use (name or UID, substring matching). Implicitly separates from siblings by focusing on uniques, but no explicit when-not-to-use or alternative tool mentions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_mod_auditB
Audit vanilla skills and items; write markdown reports.
Args: skills: Run skills audit. items: Run items audit. audit_all: Run both audits (overrides skills/items). output_dir: Directory to write reports into. Default: docs/audit.
| Name | Required | Description | Default |
|---|---|---|---|
| skills | No | ||
| items | No | ||
| audit_all | No | ||
| output_dir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions writing markdown reports to a directory, but does not disclose whether the tool is read-only, destructive, or the exact output format. With no annotations provided, the description should cover more behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: one sentence for purpose and a clear Args list. Every sentence adds value, with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description should provide more context about return values, side effects (e.g., file creation), and prerequisites (e.g., mod must be extracted). It only covers basic parameter usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to all 4 parameters (skills, items, audit_all, output_dir) beyond the schema, including defaults and the override behavior of audit_all. However, it lacks details like allowed values for output_dir or error handling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it audits vanilla skills and items and writes markdown reports. This is a clear specific verb and resource. However, it could be more explicit about what 'audit' entails to distinguish from sibling mod tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like d2r_mod_diff or d2r_mod_build. There is no mention of prerequisites or context, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_mod_buildC
Build mod from vanilla + overlays + scripts into build/.
| Name | Required | Description | Default |
|---|---|---|---|
| warn_conflicts | No | ||
| no_regen | No | ||
| game_dir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description only states the action without revealing behavioral traits such as side effects (e.g., file creation), permissions needed, or idempotency. The mention of 'into build/' implies file output but lacks specificity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise single sentence with no wasted words. However, it could be slightly expanded to improve completeness without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 optional parameters and no output schema, the description is too minimal. It fails to explain concepts like overlays/scripts, the structure of build/, or return value. Sibling tools provide context but the description itself is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 3 parameters with 0% documented in description. The description adds no meaning beyond schema field names. Agent gets no help on what these parameters do or how to set them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Build' and the resource 'mod' with inputs (vanilla, overlays, scripts) and output destination (build/). Distinguishes from sibling tools like d2r_mod_clean and d2r_mod_deploy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, no prerequisites or conditions mentioned. Relies solely on the tool name to imply usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_mod_cleanA
Wipe the local mod build artifacts to start from a clean slate.
Deletes the build/ directory and resets generated chargen data files. Does NOT touch the deployed D2R install; run d2r_mod_undeploy first if you also want to revert the running game.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses exactly what is deleted (build/ directory and chargen data) and what is not touched (deployed D2R install). No annotations provided, so description carries full burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, no wasted words, front-loaded with key action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description provides full context: purpose, scope, and prerequisite actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, schema coverage is 100% (none needed). Baseline 4 for zero parameters. Description does not need to add param info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it wipes local mod build artifacts (build/ directory and chargen data). Distinguishes from sibling tools like d2r_mod_undeploy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (start from clean slate) and when not (does not touch deployed install, suggests undeploy first for reverting game).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_mod_deployC
Build + deploy mod to the game mod folder (runs CASC injection by default).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| no_casc | No | ||
| no_build | No | ||
| warn_conflicts | No | ||
| no_regen | No | ||
| game_dir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It mentions CASC injection but does not explain what that entails, whether deployment is destructive, or what side effects occur (e.g., overwrite, backup). The flags are not described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the core purpose efficiently. It could benefit from a list of flags, but it is not overly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and no annotations, the description lacks details on return values, prerequisites, error conditions, and the effect of each flag. It is insufficient for a complex deployment tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate. It only mentions 'by default' regarding CASC injection, but does not explain individual parameters like 'force', 'no_casc', 'no_build', etc. Agents must guess from parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Build + deploy mod to the game mod folder', specifying the verb and resource. It also mentions 'runs CASC injection by default', which distinguishes it from siblings like d2r_mod_build (build only) and d2r_mod_undeploy (reverse).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives (e.g., d2r_mod_build for build only). The description implies default behavior but does not explain when to set specific flags or avoid this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_mod_diffC
Compare vanilla/ vs build/ tables. Returns list of changed files.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| summary | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description must carry burden of behavioral disclosure. It implies a read-only comparison but does not explicitly state non-destructiveness, permission requirements, or any side effects. Lacks details about the comparison process.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, concise and front-loaded. However, it sacrifices necessary details for brevity, leaving out parameter explanations and behavioral context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two optional parameters, no output schema, and no annotations, the description is severely incomplete. It does not explain what 'vanilla/ vs build/ tables' refers to, the format of returned file list, or how parameters affect behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description does not mention either parameter ('file' or 'summary'). With 0% schema coverage, the description fails to add any meaning beyond bare schema. Agent will not know how to use the parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states action 'compare' and resources 'vanilla/ vs build/ tables', and output 'list of changed files'. It is specific and easily understood, but does not differentiate from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like d2r_mod_build or d2r_save_diff. No context on prerequisites or intended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_mod_extractC
Extract vanilla data from CASC archive into vanilla/.
| Name | Required | Description | Default |
|---|---|---|---|
| game_dir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It does not disclose side effects like whether files are overwritten, whether the operation is safe to repeat, or any permissions required. This lack of transparency is a significant gap for a data extraction tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no unnecessary words. It is front-loaded with the verb and resource, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, no output schema), the description fails to clarify the purpose of 'game_dir' or what 'vanilla/' means. It does not mention return values or effects, leaving the agent without full context for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the description adds no information about the 'game_dir' parameter. The parameter has no enumeration or defaults explained, and the description offers no hint about its purpose, leaving the agent to guess.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Extract vanilla data from CASC archive into vanilla/') and distinguishes itself from sibling tools like d2r_mod_build or d2r_mod_audit by focusing on extraction rather than building or auditing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives (e.g., d2r_mod_clean or d2r_mod_build). There is no mention of prerequisites, workflow positioning, or cases where extraction should be skipped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_mod_undeployA
Revert the deployed D2R mod, restoring the vanilla game state.
Removes the mod directory from the D2R install (or keeps it on disk with keep_mod=True) and unregisters the launch options. Use this to roll back a deploy without rebuilding, or before switching to a different mod.
Args: keep_mod: If True, leave the built mod directory in place on disk. game_dir: Override the auto-detected D2R install path.
| Name | Required | Description | Default |
|---|---|---|---|
| keep_mod | No | ||
| game_dir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes actions: removes mod directory (or keeps with keep_mod=True) and unregisters launch options. Without annotations, this adequately discloses behavior. Could mention side effects like requiring game not running, but still strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with clear docstring structure. No unnecessary words; each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, parameters, and usage scenarios. No output schema, but return value is implicit (success/failure). Could mention prerequisites like mod being deployed, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are explained beyond schema: keep_mod controls whether to leave mod on disk, and game_dir overrides auto-detected path. With 0% schema coverage, description fully compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Revert' and resource 'deployed D2R mod' to restore vanilla state. Distinguishes from sibling tools like d2r_mod_deploy and d2r_mod_build by focusing on undoing a deployment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'to roll back a deploy without rebuilding, or before switching to a different mod.' No explicit when-not-to-use, but context makes alternatives obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_mod_updateC
Full recovery pipeline: extract → build → deploy.
| Name | Required | Description | Default |
|---|---|---|---|
| warn_conflicts | No | ||
| no_regen | No | ||
| game_dir | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. It mentions a multi-step pipeline but gives no details on side effects, permissions, or what gets modified. For a tool that likely performs destructive operations, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short (one sentence), but it does not convey necessary information. Conciseness should pack meaningful content into few words; here, it under-specifies the tool, making it unhelpful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, no annotations, and the complexity of a multi-step pipeline, the description is grossly incomplete. It does not explain the order of operations, return value, or how the pipeline affects the mod, leaving major gaps for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has three parameters with 0% description coverage, yet the description offers no explanation of their purpose or effects. The parameters 'warn_conflicts', 'no_regen', and 'game_dir' are completely unexplained, failing to add any value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Full recovery pipeline: extract → build → deploy', which indicates a composite operation. However, the verb 'update' in the name is not directly mapped to the pipeline, and it does not clearly specify what is being recovered. While it distinguishes itself from individual sibling tools by being a combination, it lacks specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus the individual extract, build, and deploy tools. The description does not mention prerequisites, context, or alternatives, leaving the agent without direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_save_diffC
Compare two .d2s files and return structural differences.
Args: path_a: First save (treated as "before"). path_b: Second save (treated as "after").
| Name | Required | Description | Default |
|---|---|---|---|
| path_a | Yes | ||
| path_b | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden for behavioral disclosure. While 'compare' implies a read-only operation, the description does not explicitly state that the tool makes no changes. It also fails to describe what 'structural differences' entail (e.g., specific sections compared) or the output format, leaving the agent without key behavioral information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two sentences plus parameter docs. It front-loads the core action and avoids any extraneous information. Every word serves a purpose, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is notably incomplete. It does not describe the return format, error behavior (e.g., missing files, identical saves), or limitations. For a diff tool, the agent needs this context to correctly use and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description adds only minimal semantic value: 'path_a: First save (treated as "before")' and 'path_b: Second save (treated as "after")'. It does not clarify file path expectations (absolute vs. relative, existence requirements) or any constraints, so the description insufficiently compensates for the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: comparing two .d2s files and returning structural differences. It specifies the resource type (.d2s files) and the action (compare/diff). However, it does not explicitly differentiate from sibling save tools like d2r_save_inspect or d2r_save_scan, which could cause ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides ordering guidance (path_a is 'before', path_b is 'after') but offers no information about when to use this tool versus alternatives (e.g., when a simple scan vs. diff is needed). It lacks explicit usage context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_save_inspectA
Summarize a .d2s save: class, level, stats, progression, merc.
No scanner pass — use d2r_save_scan for validation.
Args: path: Absolute path to .d2s file, or bare character name.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it does not perform validation ('No scanner pass'), which is a key behavioral trait. No annotations exist, so description carries full burden and adds relevant context about limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences and a brief argument list; every word is informative. Front-loaded with the core purpose, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter, no output schema, and no annotations, the description fully covers what it does, usage guidance, and parameter semantics. An agent can confidently select and invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to the single 'path' parameter beyond the schema: explains it expects an absolute path or a bare character name. This compensates for 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly describes 'Summarize a .d2s save' with specific fields (class, level, stats, progression, merc). Distinguishes from sibling tools like d2r_save_scan and d2r_save_list_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when not to use ('No scanner pass') and provides alternative ('use d2r_save_scan for validation'). Also explains the argument format (absolute path or character name).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_save_list_itemsA
List items on disk in a .d2s save, optionally filtered by location.
Args: path: Absolute path to .d2s file, or bare character name. location: Filter: equipped, inventory, cube, stash, merc_equipped, or None for all.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| location | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It implies a read-only operation (listing items on disk), but does not explicitly state that it does not modify data or discuss any side effects, permissions, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences for the purpose and a bulleted argument list. Every sentence adds value, and there is no verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core functionality and parameters. However, it does not describe the return format (e.g., list of item names, properties), which would be helpful given the lack of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It does so effectively: explaining that 'path' can be an absolute path or a bare character name, and clarifying that 'location' filters by specific areas or can be null for all items.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('items on disk in a .d2s save'), with optional filtering by location. This distinguishes it from sibling tools like d2r_save_diff or d2r_save_scan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies that filtering is optional and lists possible location values (equipped, inventory, cube, stash, merc_equipped, or None). While it doesn't explicitly state when not to use this tool or provide alternative tool names, the context from sibling tools makes the purpose clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_save_scanA
Run d2rdoctor scanner on a .d2s save file.
Returns a structured result with checksum/size status, item counts, and any scanner errors or warnings. status == "error" iff errors is non-empty. Deployment-blocker rule: never deploy a save that this tool flags as error (see CLAUDE.md Rule #17).
Args: path: Absolute path to .d2s file, or bare character name (resolved against Steam saves dir).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It explains the output structure (checksum/size status, item counts, errors), the condition for error status, and path resolution logic. It does not explicitly state read-only, but it is implied; still clear enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: first sentence states purpose, then output details, then parameter explanation. No redundant sentences; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only one parameter, no output schema, and no annotations, the description covers behavior, return structure, an important rule, and parameter semantics completely. It is sufficient for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'path' has no description in the input schema, so the description adds crucial meaning: it accepts absolute paths or bare character names resolved against Steam saves dir. This fully compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs d2rdoctor scanner on a .d2s save file and returns structured results. Among siblings like d2r_save_diff or d2r_save_inspect, this tool is uniquely about scanning for issues, making its purpose distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a deployment-blocker rule ('never deploy a save that this tool flags as error'), providing a strong use case. However, it does not explicitly compare to alternative save tools or state when not to use it, missing some guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
d2r_searchA
Search across ALL D2R item types: uniques, sets, runewords, bases.
Use this when you don't know what type of item you're looking for. Returns up to 20 results tagged by type.
Args: query: Search term (substring match across all item names)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states the search uses substring match across all item names, returns up to 20 results tagged by type, which are key behavioral traits. However, it omits details like case sensitivity, empty result behavior, or ordering. Still, it provides a reasonable overview for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (two sentences plus an Args section). It is front-loaded with the main purpose, then usage guidance, then parameter details. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one string input, output described by schema), the description covers the essentials: scope, matching, result limit, and tagging. The existence of an output schema offloads return-value details, and the description aligns well with expected behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'query' is described as 'search term (substring match across all item names)', adding critical meaning beyond the schema's generic 'string' type. The schema coverage is 0%, so the description fully compensates, clarifying how the parameter is used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose: 'Search across ALL D2R item types: uniques, sets, runewords, bases.' It explicitly enumerates the types, and the name 'd2r_search' contrast with specific lookup siblings like 'd2r_lookup_unique' and 'd2r_lookup_runeword', making the scope obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description contains explicit guidance: 'Use this when you don't know what type of item you're looking for.' This directly tells the agent when to prefer this tool over the type-specific lookups. It also mentions the result limit (20) and tagging, providing clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
23 tool updates
v0.1.0- First observed
d2r_chargen_build - First observed
d2r_chargen_import - First observed
d2r_chargen_list - First observed
d2r_chargen_validate - First observed
d2r_lookup_item_base - First observed
d2r_lookup_runeword - First observed
d2r_lookup_set_item - First observed
d2r_lookup_skill - First observed
d2r_lookup_stat - First observed
d2r_lookup_unique - First observed
d2r_mod_audit - First observed
d2r_mod_build - First observed
d2r_mod_clean - First observed
d2r_mod_deploy - First observed
d2r_mod_diff - First observed
d2r_mod_extract - First observed
d2r_mod_undeploy - First observed
d2r_mod_update - First observed
d2r_save_diff - First observed
d2r_save_inspect - First observed
d2r_save_list_items - First observed
d2r_save_scan - First observed
d2r_search
TDQS
Each tool has a clear, distinct purpose. The naming with category prefixes (chargen, lookup, mod, save) and specific actions prevents ambiguity. For example, d2r_chargen_build and d2r_save_inspect operate on different resources, and lookups are split by item type.
All tools follow the consistent pattern 'd2r_<category>_<action>', using snake_case uniformly. There are no mixed conventions (e.g., camelCase) or irregular formats.
23 tools cover the full modding lifecycle—character generation, lookups, mod building/deploying, and save file inspection—without being excessive. Each tool seems justified for its role.
The tool set covers the main workflows: chargen (build, import, validate), lookups (all item types), mod management (extract, build, deploy, clean, update, diff, audit), and save operations (inspect, scan, diff, list items). No obvious gaps for the intended domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
Self-hosted MCP server: 26 deterministic dev, security, and EVM tools.
Build and publish Overskill apps from Cursor, Claude, ChatGPT, or any MCP client.
Related MCP Servers
- AlicenseBqualityNot gradedmaintenanceEnables complete RPG Maker MZ game development through MCP tools, including autonomous game creation from concepts, AI-generated assets using Gemini 2.5 Flash, and programmatic control over maps, events, characters, and databases. Supports full game creation workflow from a single command with automatic story, asset, and implementation generation.3225-
- AlicenseAqualityBmaintenanceProvides fast, cached access to comprehensive Dungeons & Dragons 5th Edition data including spells, monsters, classes, races, equipment, and rules through Open5e and D\&D 5e APIs.72MIT
- AlicenseAqualityFmaintenanceProvides real-time access to Path of Exile 2 game data including currency exchange rates, item prices, and ladder meta-build statistics. It also enables LLMs to search the community wiki and retrieve datamined game information from public APIs.85MIT
- AlicenseNot gradedqualityBmaintenanceA Linux-native MCP server that gives AI assistants direct access to DMA-based memory operations for memory inspection, process analysis, reverse engineering, and game engine SDK extraction via natural language.13AGPL 3.0
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/crabsmadethis/d2r-horadric-tools'
If you have feedback or need assistance with the MCP directory API, please join our Discord server