Skip to main content
Glama

dfhack-mcp

An MCP server that gives an AI agent a live window into your Dwarf Fortress fort — a co-pilot and early-warning advisor, not an autopilot. Point Claude (or any MCP client) at it and ask "how's my fort doing?" — it reads happiness, threats, stocks, jobs, health, and defenses straight from the running game and answers in plain language.

Read-only by default. The 37 sensor and reference tools only observe the game. A handful of actuators that change the fort — queue manager orders, apply quickfort blueprints, assign labor, sound the civilian alert, pull a lever — ship behind an explicit opt-in and stay hidden until you enable them (see Taking action).

Two kinds of tools:

  • Sensors answer what is my fort doing right now?fort_status, threats, stocks, jobs_and_labor, military, injuries_and_health, defenses, and more.

  • Reference answers how does Dwarf Fortress work?game_data is your world's ground truth (its loaded raws), the wiki_* tools are the general explanation, and identify fuses the two for "what is this creature and how do I handle it."

It returns facts, not advice — already-summarized JSON that reads like a glance at the screen, leaving the judgment to the agent.

Every tool has a reference page — parameters, return shape, real example output, caveats — in docs/tools.

Quick start

The package is published to npm and ships a prebuilt bundle — there is nothing to build. Point your MCP client at it with npx:

{
  "mcpServers": {
    "dfhack": {
      "command": "npx",
      "args": ["-y", "dfhack-mcp"]
    }
  }
}

That's it for Claude Desktop / Claude Code / any stdio MCP client. npx -y dfhack-mcp fetches and runs the latest release; its runtime dependencies — the MCP SDK, zod, and the dfhack-remote-node RPC transport — are pulled from npm automatically.

Clients that browse the official MCP Registry can find this server there as io.github.alexanderolvera/dfhack-mcp; the listing is generated from server.json and points at the same npm package, so either route installs the identical build.

Then just have your fort running (next section) and ask your agent something like "check on my fort and flag anything urgent."

Prefer a pinned global install?

npm install -g dfhack-mcp     # then set "command": "dfhack-mcp", "args": []

Related MCP server: mcp-devenv

Requirements

  • Dwarf Fortress running with DFHack, with a fort loaded. The tools read the live game; if no fort is loaded they say so.

  • DFHack Remote RPC on localhost:5000. This is on by default whenever DF runs with DFHack — no config file to edit. (The allow_remote setting only governs connections from other machines and can stay false; a local MCP server reaches it either way.) Point elsewhere with DFHACK_HOST / DFHACK_PORT.

  • Node 20+ to run the published package. (Node 24+ only if you develop from source — see Development.)

What you can ask it

Your agent picks the tools; you just describe what you want. The tools below are what it has to work with.

Sensors — the state of your fort

No arguments; each reports on the loaded fort.

  • fort_status() — name, date/season, population, wealth, happiness breakdown, pre-triaged alerts.

  • stocks() — food/drink as days-of-supply, plus critical material counts and notable low/high lists.

  • threats() — dangerous units grouped by type; active vs. contained, great-danger/invader/undead flags, plus each group's decisive traits (trapavoid, flier, fire, webber, building-destroyer, ranged).

  • unmet_needs() — the needs system aggregated: the top unmet needs ranked by how many dwarves are distracted, and how starved each is.

  • jobs_and_labor() — workforce utilization: busy vs. idle adults (children excluded), idle %, and a ranked breakdown of active jobs.

  • military() — squads, enlisted soldiers, filled positions, readiness against hostiles on the map, and per-squad roster equipment gaps (missing uniform pieces), ammo, and active training order.

  • injuries_and_health() — wounded / patients / bedridden / unconscious counts, plus the care needed (diagnosis, surgery, suture, …).

  • defenses() — active hostiles with map positions and distance/direction/z-delta to the fort core and nearest drawbridge, plus a controllable-structure inventory (bridges, levers, floodgates, hatches, cage traps, doors).

  • burrows() — every burrow's size and membership, plus the civilian-alert safety-burrow set (configured/active/linked burrows) — the read half of civilian_alert.

  • mechanisms() — every lever's position, state, and linked target(s) (bridge/door/floodgate/hatch/support/weapon-trap); pressure-plate trigger conditions; unlinked levers and bridges.

  • moods() — any active strange mood (fey/secretive/possessed/macabre/fell): the dwarf, driving skill, workshop state, and each demanded material cross-referenced against fort stock — the "demands bones, fort has zero" early warning.

  • mandates_and_justice() — the nobility's overhead: active production mandates and export bans, unmet noble room demands, and justice state (open cases, convictions awaiting punishment, restraint capacity).

  • rooms_and_zones() — the facility inventory, each count paired with its demand-side number: bedrooms, dining halls, the hospital, wells, temples, taverns, libraries, guildhalls, and coffins free vs. dead awaiting burial. The supply-side companion to unmet_needs().

  • trade() — the caravan lifecycle and trade depot: depot existence/completeness and wagon-accessibility, caravans present and their state, broker assignment/presence, and the count and approximate value of goods staged in the depot.

  • environment() — ambient conditions right now: season and weather, surface temperature and whether exposed water is frozen, the embark's biome alignment (evil/good/reanimating), and — for each cavern the fort has already breached — whether it is open or sealed. Fog-of-war honest.

  • find_unit(query) — look up citizens by name fragment or profession; a compact dossier per match (profession, age, stress, job, squad, health flags). Chain into citizen for depth.

  • citizen(unit_id) — the full character sheet for one dwarf: social graph (spouse/parents/children/friends/grudges, each with a unit_id you can walk), worshipped deities, notable personality extremes, skills of note, likes/detests, and recent thoughts tied to current stress.

  • site_history() — the fort's entry in the world saga: founding, the fort name in Dwarven + English with etymology, prior sieges/battles at the site, and notable figures who died here.

  • artifacts_and_engravings() — the fort's masterworks and notable engravings.

  • chronicle() — a scannable recent-events feed for the fort.

Spatial (fog-of-war honest — undiscovered tiles never leak):

  • map_overview() — cheap orientation to run before any per-tile read: map extents, the fort-core coordinate, the surface z-level, the z-levels carrying player activity (digging/construction), and stairways as vertical columns. Fixed-size regardless of fort size.

  • tile_region(z?, x0?, y0?, x1?, y1?) — a bounded window of one z-level as an ASCII grid plus a self-describing legend. Undiscovered tiles stay ?. All params optional: none → a 60×40 window on the fort core; z alone → that level's centroid; explicit corners otherwise. Hard-capped at 100×100 (oversized requests are clamped, never errored). Renders the map; never designs it.

    glyph

    meaning

    glyph

    meaning

    ?

    undiscovered (fog of war)

    +

    constructed floor

    #

    undug stone / wall

    ~

    water / brook

    ,

    undug soil (sand/clay/loam)

    %

    magma

    .

    dug floor / walkable ground

    W

    workshop / furnace

    F

    fortification

    S

    stockpile

    r

    ramp

    M

    machine (gear/axle/pump/wheel/windmill)

    v

    ramp top

    n

    furniture (bed/chair/table/door/etc)

    < > x

    up / down / up-down stair

    (space)

    open space

    T

    tree

  • geology(reveal_hidden?) — a one-call geological survey (revealed-info only by default): surface z-level, the exposed layer stack with material names, the aquifer (light vs. heavy, z-range), discovered caverns, whether the magma sea is reached, and surface water. reveal_hidden: true bypasses fog of war (a debug/spoiler switch, default off).

Reference — how DF works

wiki_* are pure HTTP and work without the game; game_data / identify read a loaded world.

  • game_data(query, kind?) — your world's raws across six kinds (creature, material, plant, reaction, item, building; default creature). Ground truth for procedural creatures (demons, forgotten beasts, titans) that never reach the wiki. query is a token (DEMON_4, INORGANIC:IRON), a name ("plump helmet"), or — for creatures — a live unit_id. One strong hit → a full dossier; several → a disambiguation list; none → {"match_count":0,"matches":[]}.

  • identify(query)"what is this creature and how do I handle it" in one call: fuses game_data (your world's raws) with wiki_lookup (strategy). Returns the dossier (its flags[]/interactions[] carry facts like TRAPAVOID → mechanical traps don't work) plus 1–2 trimmed wiki excerpts. Reach for it when a threat appears.

  • wiki_search(query) — search the DF wiki for candidate titles + cleaned snippets (biased to the DF2014 namespace).

  • wiki_lookup(title, section?, refresh?) — fetch a wiki article as clean text, pinned to DF2014; follows redirects, honors section fragments, cached ~30 days.

Taking action (actuators)

By default every tool above only reads the game. The actuators change the fort, so they ship behind an explicit switch — set DFHACK_MCP_ACTUATORS and they appear in the tool list; leave it unset and the server is strictly read-only.

{
  "mcpServers": {
    "dfhack": {
      "command": "npx",
      "args": ["-y", "dfhack-mcp"],
      "env": { "DFHACK_MCP_ACTUATORS": "1" }
    }
  }
}

Every actuator uses the same preview → confirm → apply → undo safety loop, so a change is never a surprise:

  1. Preview (dry-run). The agent calls the tool with the operation fully specified but no confirmation token. It gets back a preview of exactly what would change — facts, never advice — plus a single-use confirm_token. Nothing is written. If the operation can't be applied as asked (e.g. a malformed blueprint), the preview reports why and no token is issued.

  2. Apply. The agent calls again with the same arguments plus that token. The server re-checks that the thing being acted on hasn't changed since the preview; if it has, the token is void and the agent re-previews. On success it gets an undo handle and a readback from the matching sensor confirming the change.

Tokens are single-use and target-scoped: an unrelated change elsewhere in the fort does not void them, but a change to the target does. Each actuator names its own reversal path.

Manager work orders

  • work_order_list(after_id?)read-only, always available. The fort's manager orders as facts: id, job type, output item/material, amount total/left, repeat frequency, bound workshop, and per-order validation state. Paged (cap 256) with a cursor.

  • work_order_create(job_type, amount, frequency?, material?, item_type?) — queue a new order; the preview flags would_duplicate and manager_present. Reversal: work_order_cancel.

  • work_order_cancel(order_id) — remove one order by id; the undo handle is a recreate spec (with a faithful flag when a workshop binding or conditions can't be fully restored).

Quickfort blueprints — designate dig/zone from an agent-drafted quickfort CSV. There's no separate read sensor: blueprint_apply without a token is the preview.

  • blueprint_apply(csv, anchor_x, anchor_y, anchor_z, mode) — designate from a #dig or #zone blueprint; the top-left cell maps to the anchor. The dry-run parses quickfort's own stats and previews tiles affected, footprint, and fog-of-war tiles under it (a fact, never blocked). A malformed blueprint blocks with no token (quickfort would partially apply). v1 scope: dig + zone onlybuild/place are rejected. Reversal: blueprint_undo.

  • blueprint_undo(csv, anchor_x, anchor_y, anchor_z, mode) — revert a dig/zone designation via quickfort's native undo (same csv/anchor/mode). The token signs a per-cell digest, so any per-cell drift voids it.

Labor via work details

  • work_details()read-only, always available. Every work detail (the game's labor groups): name, mode, the labor tokens it enables, and its assigned citizens (id-sorted, capped at 200 with the full member_count).

  • assign_work_detail(unit_id, detail, enabled) — add or remove one citizen to/from one detail. The preview reports currently_member, resulting_members_count, and only_member; an already-satisfied request previews as a no-op. Reversal: the same call with enabled inverted.

Emergency response

  • burrows()read-only, always available. Every burrow's size and membership, plus the civilian alert's own state: configured (has the fort ever set one up), active (is it sounding right now), and the linked burrow ids.

  • civilian_alert(burrow, enabled) — add or remove one burrow from the civilian-alert safety set. enabled=true also sounds the alarm if it wasn't already; enabled=false only silences it once the set becomes fully empty. Reversal: the same call with enabled inverted.

  • mechanisms()read-only, always available. Every lever/pressure-plate's position and linked target(s) (bridge/door/floodgate/hatch/support/weapon-trap), plus unlinked levers and bridges.

  • pull_lever(lever_id, urgent?) — queue a job for a dwarf to pull a named lever (urgent defaults to do-now priority). This queues the job; the physical toggle happens once a dwarf completes it, not on apply. Reversal: pull the same lever again.

Saving the game

  • game_save() — checkpoint the fort with a quicksave before a large or risky change, so a bad batch can be rolled back by loading the save. Takes no arguments; the dry-run previews the fort and game date being frozen. Two facts to know: the write is asynchronous (DF commits it over the next few frames — the readback confirms the quicksave dispatched, not that the file landed) and it routes through DF's autosave, so it lands in a rotating "autosave" folder per your DF settings rather than overwriting the loaded save. Irreversible: to roll back, load the appropriate save/autosave in DF. Fortress mode only.

Configuration

All optional, set in your MCP client's env for the server:

Variable

Default

Effect

DFHACK_HOST

127.0.0.1

Host where DFHack's Remote RPC is listening.

DFHACK_PORT

5000

Port for DFHack's Remote RPC.

DFHACK_MCP_ACTUATORS

(unset)

Set to 1 to expose the write actuators (off = strictly read-only).

DFHACK_MCP_DEV

(unset)

Set to 1 to expose run_lua, a raw DFHack Lua escape hatch (reads and writes game state; for tool authors only).

Troubleshooting

  • {"error":"no fort loaded"} — DFHack is reachable but you're at the title screen or in the menus. Load a fort in Fortress mode.

  • An error about not reaching DFHack — Dwarf Fortress isn't running with DFHack, or the RPC port differs. Confirm DF is up with DFHack and that DFHACK_HOST / DFHACK_PORT match (defaults 127.0.0.1:5000).

  • The tools don't show up in your client — restart the MCP client so it relaunches the server; a running server won't pick up a config change.

  • The write tools are missing — that's the default. Set DFHACK_MCP_ACTUATORS=1 (see Taking action).

  • First call after loading a fort errors once, then works — a freshly-started DFHack can reject the very first tool call while it finishes registering the query scripts; retry once.

Development

To hack on the server itself, clone and run the TypeScript entry directly (Node 24+ — it runs the sources via type-stripping, no build step):

git clone https://github.com/alexanderolvera/dfhack-mcp.git
cd dfhack-mcp
npm install        # or: npm run bootstrap  (installs + runs the T0 contract check)
node src/index.ts

Point an MCP client at the checkout with "command": "node", "args": ["/absolute/path/to/dfhack-mcp/src/index.ts"].

All version-fragile DFHack field access lives in real .lua scripts under src/dfhack-queries/ (one per tool), invoked by name with native argv — so a DF/DFHack version bump is a localized fix and query parameters are injection-safe by construction. Each tool is a thin TypeScript wrapper in src/tools/.

Facts, not advice. Tools sense — they return what is true about the fort and the world, the way a player reads a screen. They do not say what to build or how to fight; that judgment is the agent's. A field that says what to do is advice — leave it out.

Every tool is verified against a live fort with the tiered harness (npm run verify:t0t2) — never mocks. See CONTRIBUTING.md for the tool-authoring split and the verification workflow, and docs/VERIFY.md for the harness tiers.

License

ISC — see LICENSE.md.

Available Tools

37 tools
artifacts_and_engravingsArtifacts and engravingsA

The fort's art, as labeled facts. Returns the named ARTIFACTS (paginated), SITE-SCOPED BY DEFAULT — only artifacts belonging to the loaded fort, which is almost always what is meant by "our artifacts". Pass scope="world" for every artifact in the world (an old world holds hundreds that have nothing to do with your fort; in world scope each row carries site_local so the two are still distinguishable). artifact_count always reflects the scope actually applied, and artifact_count_world always gives the unfiltered world total. Each artifact carries its name (dwarven + translated), item type and base material, created value, quality, maker (with a live unit_id ONLY when the maker is a living current citizen, else just the historical-figure name), the decorations on it (bands/covered/rings/images with their materials), and any engraved inscription text (e.g. a slab's secret). Plus an aggregated ENGRAVINGS summary for the map: engravings grouped BY SUBJECT with counts (never itemized per tile), a quality histogram, and the top engravers. IMPORTANT precondition on engraving subjects: DF does not populate the world's art-image table in fortress mode (art_images_loaded is false on every fort observed so far), so the human-readable scene an engraving depicts is NOT available — subjects_resolvable=false and each subject is keyed by its stable image reference ("image #2:158") instead. This is reported, never fabricated, but do not plan on describing what the fort's art depicts: the engraving read is reliable for counts, quality distribution, and which dwarves did the engraving, not for iconography. Use limit + next_cursor to page through artifacts; see caps for all documented limits. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoArtifacts per page (default 25, max 100). Engravings are always fully aggregated.
scopeNoWhich artifacts to return. "site" (default) = only this fort's artifacts. "world" = every artifact in the world, each tagged with site_local.
cursorNoOpaque pagination cursor from a previous call's next_cursor; omit for the first page.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and excels: it discloses pagination behavior ('Use limit + next_cursor'), scope-dependent counts ('artifact_count always reflects the scope actually applied'), conditional maker unit_id ('only when the maker is a living current citizen'), the critical limitation that art_images_loaded is false (subjects_resolvable=false), and the error response ('{"error":"no fort loaded"}'). This exceeds typical transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although long, every sentence serves a purpose. It opens with a crisp summary, then systematically covers artifact fields, engraving aggregation, a critical precondition, pagination, and error handling. The structure is front-loaded with the core purpose and flows logically, with no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description fully describes the return shape: artifact fields (name, type, material, value, quality, maker, decorations, inscriptions) and the engraving summary (grouped by subject, quality histogram, top engravers). It covers limitations, errors, and pagination. For a tool of this complexity, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful nuance beyond the schema: it explains the semantic difference between site and world scope ('in world scope each row carries site_local so the two are still distinguishable') and how artifact_count reflects scope. Pagination via cursor is also clarified ('Use limit + next_cursor to page through artifacts'). This is more than a token addition, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'The fort's art, as labeled facts' and immediately specifies 'Returns the named ARTIFACTS (paginated), SITE-SCOPED BY DEFAULT' plus 'an aggregated ENGRAVINGS summary'. This clearly names the resource (artifacts and engravings) and the verbs (returns, aggregated), making it fully distinguishable from sibling tools like site_history or map_overview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly guides scope selection: 'SITE-SCOPED BY DEFAULT — only artifacts belonging to the loaded fort, which is almost always what is meant by "our artifacts"' and 'Pass scope="world" for every artifact'. It also warns against relying on iconography: 'do not plan on describing what the fort's art depicts'. However, no alternative tools are named, so it stops short of the 'alternatives' bar for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

burrowsBurrowsA

The fort's burrows as facts: each burrow's id, name, exact tile_count (dfhack.burrows.isAssignedBlockTile summed over every assigned block — the precise painted area, not a bounding box), assigned_units (citizens/animals manually confined to it, id-sorted and capped at 200 — assigned_units_total is always the full count and assigned_units_truncated flags when capped), and civilian_alert_linked — whether this burrow is currently one of the safety burrows for the civilian alert (see civilian_alert). civilian_alert reports the alert's own state: configured (has the fort ever set up a civilian-alert slot — false on a fresh fort), active (is it sounding right now — civilians already fleeing to the linked burrow(s)), and burrows (the linked burrow ids). Pairs with the civilian_alert actuator, which toggles a named burrow in or out of this set. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

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 discloses exact computation of tile_count (summed over assigned blocks, not bounding box), the 200-item cap on assigned_units with truncation flag, and the error case for no fort loaded. This is thorough and transparent for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed and front-loaded with the core purpose, followed by field-by-field explanations and a brief note on the error response. While it is long, every sentence adds value given the lack of output schema and annotations. The parenthetical explanations are dense but informative, though slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and zero parameters, the description is remarkably complete. It covers the return object's fields, the precise meaning of tile_count, the assignment cap behavior, the relationship with civilian_alert, and the error case. This leaves no significant gaps for an agent to understand the tool's function.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds no parameter-specific semantics because there are none, but it fully explains the output structure which is the only relevant aspect for an agent invoking this tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns the fort's burrows as facts, enumerating specific fields (id, name, tile_count, assigned_units, civilian_alert_linked). It distinguishes itself from the civilian_alert tool by explaining that civilian_alert reports the alert's own state, while this tool provides burrow data. The verb is implicit but the resource and scope are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use this tool versus civilian_alert, noting that civilian_alert reports the alert's own state and mentions it pairs with a toggling actuator. However, it doesn't explicitly state 'use this for burrow information' or provide exclusions. The relationship is implied rather than directly instructing the agent on selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chronicleChronicleA

The fort's announcement/report stream (combat, deaths, moods, artifacts, sieges, migrants, ...) as triaged, cursor-addressable events. Reads the rolling, front-pruned report window. Each event carries a stable id (monotonic and save/load-stable); pass the returned top-level cursor back as since to fetch only newer events (id > since). Omitting since returns the most recent limit events (default 50, max 200), oldest-to-newest. If since predates the retained window the response sets pruned:true (earlier events are gone — not silently omitted). Events are triaged into categories (death, birth, marriage, battle, siege, mood, artifact, migrants, diplomacy, cave-in, megabeast, other); filter with categories. Combat spam is tamed: repeat_count is honored, wrapped continuation lines fold into their event, and long consecutive battle runs collapse into a single marker (collapsed:true with collapsed_count) so one siege cannot flood the window — see battle_collapsed. Facts only: unit refs appear only when a report names a speaker (speaker_id != -1); combat reports carry no reliable unit, so they get a pos tile anchor instead. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax events to return (default 50, capped at 200); newest are kept.
sinceNoCursor: return only events with id greater than this (from a prior `cursor`).
categoriesNoOptional subset of categories to return: death, birth, marriage, battle, siege, mood, artifact, migrants, diplomacy, cave-in, megabeast, other.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description thoroughly discloses behavioral traits: the front-pruned window, stable ids, `pruned:true` flag, combat spam collapsing, and the rules about speaker_id and pos tile anchors. It even specifies the error response for no fort loaded, covering edge cases comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence contributes necessary information. It is front-loaded with the core purpose, then logically progresses through cursor usage, defaults, pruning, categories, combat spam handling, facts, and error handling. There is no redundancy or filler, making it appropriately concise for its complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and lack of output schema, the description covers return semantics (cursor, pruned, collapsed), error handling, and parameter behavior. It preemptively answers likely questions about pagination, stale cursors, and combat-heavy stream summaries, making it contextually complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents all parameters, the description adds significant context: default limit 50 and max 200, oldest-to-newest ordering, `since` semantics (id > since), and the pruned flag when `since` is stale. It also clarifies the `categories` filter with an exhaustive list of values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as reading the fort's announcement/report stream and specifies the event types (combat, deaths, moods, artifacts, sieges, migrants). It distinguishes itself from sibling tools by focusing on this unique stream with triaged, cursor-addressable events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains when to use the tool (to fetch announcements) and provides detailed usage instructions: passing `cursor` back as `since` for incremental fetches, omitting `since` for recent events, and using `categories` to filter. However, it does not explicitly mention when not to use it or compare it with alternatives, though the tool's unique scope makes this less critical.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

citizenCitizenA

A deep dossier on ONE citizen, chained by unit_id from find_unit (or chronicle). Where find_unit stays compact, this is the depth: the walkable social graph (spouse, parents, children, friends, grudges — each with a unit_id you can pass back into citizen() to walk the graph), worshipped deities with worship strength, NOTABLE personality extremes (only the top/bottom facets, not the full 50-facet dump), skills of note, likes/detests, physical highlights, and recent thoughts as the game phrases them (raw caption templates that may contain unfilled [quality]/[deity]/[relation] placeholders, surfaced verbatim), tied to current stress. Friends are positive-affection acquaintances; grudges are bonds gone negative with no positive love to offset them (each carries its raw love/trust/respect scores plus negative_dims naming the negative dimensions, as labeled facts). Empty categories degrade to []. Facts only — it senses, it does not advise. Returns {"error":...} for a missing unit_id or {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
unit_idYesA live unit_id (all digits), e.g. from a find_unit match

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavior. It thoroughly covers what the tool returns (social graph, deities, personality extremes, etc.), defines friends/grudges, notes placeholder caveats in thoughts, states empty categories degrade to [], and explicitly covers error responses for missing unit_id or no fort. It even clarifies 'Facts only — it senses, it does not advise.'

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but each sentence provides valuable detail, from data categories to error handling to placeholder behavior. It is front-loaded with the main purpose and uses a clear contrast with find_unit. While slightly verbose, it does not waste words and is well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema and annotations, the description does an excellent job of covering all necessary context. It enumerates the full set of returned categories, defines the semantics of friends/grudges, explains the placeholder issue, and states both error conditions. It fully equips an agent to decide when to call the tool and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents unit_id with pattern and description, so the baseline is 3. The description adds extra meaning by explaining where unit_id comes from ('find_unit or chronicle') and that it enables graph walking ('each with a unit_id you can pass back into citizen()'). This adds chaining semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides 'a deep dossier on ONE citizen' and differentiates from the sibling tool by explicitly noting 'Where find_unit stays compact, this is the depth.' This identifies the tool's specific verb (provide a deep dossier) and resource (citizen), distinguishing it from alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the chaining context: 'chained by unit_id from find_unit (or chronicle)' and contrasts with find_unit. This provides clear context on when to use the tool, but it doesn't explicitly list exclusions or say 'don't use when you only need a compact summary.' The alternative is named, so it nearly meets the highest bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defensesDefensesA

Where the threats are versus what you have to fight them with. Returns active hostiles the fort has DISCOVERED (same fog-of-war gate and same count as threats()' active_hostiles and military()'s hostiles_on_map — a unit standing on an undiscovered tile is never listed and never leaks its position or creature token) with map positions and their geometry to the fort core and to the nearest drawbridge (dist = 8-directional tile count (Chebyshev), dz = z-levels with + meaning above the threat, dir = compass bearing; the nearest bridge is chosen on 3D distance, so a bridge many z-levels away never wins on horizontal proximity alone), plus an inventory of controllable defensive structures (drawbridges with positions, levers, floodgates, hatches, cage traps, locked doors). Terrain-aware: each threat is classified inside/outside the fort's walled perimeter — "inside" means its tile shares a walkability group with your citizens, i.e. a hostile could walk to your population through connected open space without breaching a wall (walk_group 0 = no walkable footing, e.g. a flier over open air). A perimeter_terrain field reads the busiest citizen level via the terrain substrate: an ASCII tile grid (with legend) plus counts of walls, fortifications (with positions), and open-to-sky vs covered vs undiscovered tiles. Facts only — decide the tactics yourself, and use identify() for a creature's trait facts (e.g. cage traps do not hold a TRAPAVOID creature). Caveats: inside/outside is walking connectivity, so a FLIER or BUILDING_DESTROYER can reach you while reported "outside" — cross-reference its traits. perimeter_terrain is a single z-level and does not synthesize a multi-z approach vector; undiscovered tiles are fog of war ("?") and never leak their real type. Which lever raises which bridge is not recorded in the raws, so bridges and levers are reported separately, not linked. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains fog-of-war gating, the exact distance metric (Chebyshev), the classification of inside/outside via walkability groups, and the per-z-level terrain view. It also discloses caveats about unlinked levers/bridges, undiscovered tiles as '?', and the exact error message when no fort is loaded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence adds unique, non-redundant information about distance calculations, terrain logic, and caveats. The opening sentence effectively front-loads the core purpose. It could be tightened by splitting into bullet points, but the density of new information justifies its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, empty schema, no annotations, and no output schema, the description is exceptionally complete. It covers all returned data categories, calculation methods, edge cases (e.g., no walkable footing), and the error condition. It leaves no significant behavioral aspect unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description correctly omits parameter details. The baseline for no params is 4, and the description adds no irrelevant parameter info. It confirms the schema's emptiness by focusing entirely on the output and behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's dual purpose: reporting active discovered hostiles with their geometry to fort structures, and listing controllable defensive structures. It distinguishes itself from siblings like threats() by explicitly comparing its hostiles count to threats()' active_hostiles and adding the defensive inventory. The verb 'returns' and concrete resources make the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context, telling the agent to use identify() for creature trait facts (explicit alternative) and warning about fliers/buildings that may be reported 'outside' despite being a threat. It also notes limitations like single-z terrain, implicitly guiding when to cross-reference other tools. However, it doesn't explicitly say when to prefer this over threats() or military(), but the added defensive structures make the unique value clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

environmentEnvironmentA

The fort's ambient conditions right now: current season and dominant weather (none/rain/snow), the surface temperature with whether exposed water is currently frozen (the freezing point is 10000 DF units; composes with geology()'s freeze-in-winter fact), the alignment of the biomes visible at embark (evil / good / reanimating booleans), and — for each cavern the fort has ALREADY breached — whether it is open to fort pathing or sealed off. Fog-of-war honest: reports NOTHING about undiscovered cavern layers (a fort that has breached none returns an empty caverns list). Small fixed-size payload. Per-tile savagery is unavailable in this DFHack build, so no savage flag is reported. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so thoroughly: it discloses fog-of-war behavior (reports nothing about undiscovered cavern layers), error handling (returns error if no fort loaded), and build limitations (no savage flag). It also notes the payload is small and fixed-size, adding performance context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph that front-loads the main payload and uses clarifying asides. Every sentence adds value, but the length could be slightly reduced by breaking into bullet points or trimming redundant phrasing like 'Small fixed-size payload.' Still, it remains well within acceptable bounds.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description must explain the return values and edge cases, which it does comprehensively: season, weather, temperature, freezing condition, biome alignment, cavern list, empty list behavior, and error response. It also addresses limitations like unavailable per-tile savagery, making the tool's behavior fully predictable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema provides no parameter semantics. The baseline for 0 params is 4, and the description compensates by explaining what the tool returns rather than parameter details, which is appropriate given the output-focused nature of the tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a read-only environmental status reporter, enumerating specific outputs (season, weather, temperature, freezing, biome alignments, cavern states). It distinguishes itself from siblings like geology and tile_region by focusing on ambient conditions and explicitly referencing geology's complementary fact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (to check ambient conditions, frozen water, biome alignment, cavern accessibility) and even suggests composition with geology(). However, it does not explicitly state when not to use it or name alternative tools for cases like per-tile savagery, which is mentioned as unavailable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

farmingFarmingA

The fort's farm plots and seed stock as facts — the early-survival pipeline that stocks (food OUTPUTS) and game_data (what is plantable, in the abstract) don't cover. Each plot's tile size, whether it's open to the sky right now (open_to_sky — light/weather exposure, NOT a surface-vs-underground fact: a roofed surface plot is open_to_sky:false, indistinguishable here from a genuinely underground one), its crop assignment for each of the 4 seasons (SPRING/SUMMER/AUTUMN/WINTER; crop is the plant token or absent if that season is fallow), whether that crop is eligible to grow in that season (the plant raw's own season flag — absent when the season is fallow). no_crop_assigned flags a plot with no crop assigned in ANY season; no_eligible_crop flags a plot with no season holding BOTH an assigned crop AND eligibility (a strict superset of no_crop_assigned — a plot can have crops assigned yet still qualify if none of them are actually eligible for their season). seed_totals[]/seed_totals_count/seed_totals_truncated sums seed counts by plant across the whole fort (forbidden/dumped/rotten/trader-bound seeds excluded, capped at 100 distinct plants) — the single source for seed stock; join a plot season's crop token against it rather than looking for a per-plot seed count, which would just repeat the same fort-wide number under every plot growing that crop. plots[] is capped at 200 (plots_total/plots_truncated track the real count and any overflow). Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and excels: it discloses seed exclusions (forbidden/dumped/rotten/trader-bound), caps (100 plants, 200 plots), truncation flags, the open_to_sky clarification, and the relationship between no_crop_assigned and no_eligible_crop. It even notes the error response when no fort is loaded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though long, the description is dense with essential information and structured logically: purpose first, then plot fields, flags, seed totals, caps, and error. Every sentence earns its place, making it appropriately sized for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complex output structure and no output schema, the description fully explains the return values: plot dimensions, open_to_sky semantics, seasonal crop assignments, eligibility flags, seed count aggregation, caps, and error conditions. It also situates itself among siblings, making it complete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and empty schema, so the baseline is 4. No parameter information is needed, and the description does not attempt to fabricate any. It instead adds valuable semantics about the output data model, which is a bonus.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns farm plots and seed stock, and explicitly distinguishes it from sibling tools: 'stocks (food OUTPUTS) and game_data (what is plantable, in the abstract) don't cover.' This is a specific verb+resource with clear differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool vs alternatives by noting what it covers that stocks and game_data don't. It also designates seed_totals as 'the single source for seed stock' and warns against using per-plot seed counts, giving clear usage direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_unitFind unitA

Look up citizens by a name fragment or profession (case-insensitive, matches either). Returns a compact dossier per match: profession, age, stress level, current job, squad, and health flags (wounded/patient/unconscious). Useful for questions like "how is the chief medical dwarf" or "find Urist". Each match carries a unit_id — pass it to citizen() for a deep dossier (personality, the walkable social graph, worship, skills, preferences, recent thoughts). Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesName fragment or profession to search for

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it excels: it discloses case-insensitivity, matching against either field, the exact return fields (profession, age, stress level, etc.), the error condition ('no fort loaded'), and the linkage to unit_id for further lookups. No behavioral trait is left unclear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences long, but every sentence carries unique information: purpose, return contents, usage examples, next-step guidance, and error behavior. It is front-loaded with the core action and stays dense without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description compensates by enumerating all return fields and their semantics. It also covers error behavior and provides a clear path to deeper investigation, making it fully self-contained for this low-complexity tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema describes the query parameter as 'Name fragment or profession to search for', the description adds critical semantics: case-insensitive, matches either field, and provides example queries. This significantly enriches the parameter's meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Look up') and resource ('citizens'), and specifies matching by name fragment or profession. It clearly distinguishes itself from the sibling tool 'citizen' by noting that deep dossiers require passing the unit_id to citizen().

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage examples ('how is the chief medical dwarf' or 'find Urist') illustrate when to use this tool. It also provides an explicit alternative: use citizen() for a deep dossier, giving clear when-to-use versus when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fluidsFluidsA

Water and magma engineering facts the Earthworks tier (tile_region, geology) does not cover: aquifer layers, standing/flowing water, the magma sea's top, flood exposure at the fort interior, and well water-source depth. Revealed-only, fog-of-war safe — undiscovered tiles never contribute to any field here, the same as tile_region/defenses. aquifer_layers[] groups contiguous revealed z-levels sharing the same light/heavy classification (a mix of both within a run of z-levels reads "mixed") with light_tiles/heavy_tiles tile counts (capped at 50 layers). water_layers[] is a per-z-level aggregate of revealed standing/flowing water tiles (tiles, salt_tiles/fresh_tiles, stagnant_tiles/flowing_tiles, max_depth 1..7) — NOT flood-filled into discrete named bodies (no connectivity analysis is attempted; a single lake spanning two z-levels appears as two rows) — capped at 200 z-levels. ice_layers[] is the frozen peer of water_layers[]: a per-z-level count of revealed ICE tiles (walkable_tiles = ice you can stand on, e.g. a frozen river surface; solid_tiles = ice wall you would have to mine; the two always sum to tiles), capped at 200 z-levels. Frozen water is NOT water as far as the engine is concerned — it has no flow and becomes a solid tile — so a river or brook that freezes over DISAPPEARS from water_layers[] entirely and shows up here instead. A fort reading water_layers: [] alongside a populated ice_layers[] has surface water that exists but is frozen, which is also when wells report source "frozen" and jobs cancel for "No water source". magma_sea is the highest revealed z-level with at least 20 revealed magma tiles (a size floor meant to separate a real magma sea from a small pool/volcano pipe), omitted (not a null field) if no such level is revealed. flood_risk_tiles[] lists revealed FULL-depth (max_depth 7/7) water tiles chebyshev-adjacent to a tile in the same walkable group as any citizen — a flood-EXPOSURE fact (this water sits next to fort-reachable space right now), not a prediction of whether or when it floods anything; capped at 50 (flood_risk_total/flood_risk_truncated track the real count). wells[] extends rooms_and_zones' well read with each well's x/y and the water source found scanning down from it (source: water/magma/frozen/unknown, depth_to_source in z-levels; depth_to_source is absent if the source is unknown or the scan hit a hidden tile first) — capped at 20. scan.complete is false if the fort-wide tile budget was hit before reaching z=0 (scan.last_z_scanned marks where it stopped); every field above is still fog-of-war-safe when that happens, just possibly missing deep layers. Facts only — no dig/pump/floodgate recommendations. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and excels. It discloses how fields are computed (revealed-only, fog-of-war safe), caps (50 layers, 200 z-levels, 50 flood risk, 20 wells), special cases (frozen water disappears from water_layers, 'mixed' classification, magma sea threshold, flood risk as exposure not prediction), error handling ('no fort loaded'), and the scan.complete flag when the tile budget is hit. This is exceptionally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense with information. Every sentence adds value: each field is explained with meanings, caps, and edge cases. It is structured as a single flowing paragraph, which could be improved with bullet points or section breaks for readability, but given the complexity, the length is justified and there is no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description is the sole source for return value semantics. It covers every field (aquifer_layers, water_layers, ice_layers, magma_sea, flood_risk_tiles, wells) in detail, including sub-field meanings, caps, and interactions. It also explains the scan.complete flag and error response, making it fully complete for an agent to understand what the tool returns and its limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4 per the rubric. The description doesn't need to explain parameter semantics; it instead thoroughly describes the output fields, which is valuable but outside this dimension. No deduction needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Water and magma engineering facts the Earthworks tier (tile_region, geology) does not cover' and enumerates specific resources like aquifer layers, standing/flowing water, magma sea, flood exposure, and well depth. It distinguishes itself from sibling tools by explicitly naming what it covers beyond tile_region and geology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The first sentence frames this as the complement to tile_region/geology, indicating when to use it (when you need water/magma engineering facts not covered by those). It also mentions 'Facts only — no dig/pump/floodgate recommendations' as an exclusion. However, it doesn't give explicit scenarios like 'use when planning flood defenses' or contrast with every alternative, but the guidance is clear and useful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fort_healthFort healthA

The fort's computational health as facts — FPS death is the true endgame boss, and nothing else reports it. fps/gfps are the engine's own currently calculated simulation/graphics frame rates (df.global.enabler.calculated_fps/calculated_gfps — the same numbers DF's own FPS counter shows), not an average or a history. items.total is the fort-wide item-object count (df.global.world.items.all, unfiltered by forbidden/dump/rotten/construction state — every item DF is tracking counts toward this, since object count, not usable stock, is what costs simulation time); items.stone/corpses/clothes break out the three clutter candidates the issue names (stone: BOULDER; corpses: CORPSE + CORPSEPIECE + REMAINS; clothes: the wearable slots ARMOR/SHOES/HELM/GLOVES/PANTS) — these are raw totals and will run higher than stocks' counts, which filter to usable/in-play items only; the two answer different questions (clutter vs usable stock) and are not duplicates. units.active/units.dead_on_map split df.global.world.units.active by isDead — active is every currently-simulated living unit (citizens, tame animals, wildlife, hostiles, visitors), dead_on_map is a dead unit whose body hasn't yet been cleaned up into a corpse item; both are fog-of-war filtered (mcp_unitVisibility), like every other unit-enumerating tool in this server, so an undiscovered cavern's unrevealed population is never counted here even though it still costs real simulation time — this tool intentionally undercounts true computational load rather than leak an unexplored area's population as an aggregate number. Stray/unassigned animal count is intentionally NOT duplicated here: call livestock_and_pastures and read its unassigned_count. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries behavioral disclosure. It explains that fps/gfps are current calculated values (not averages), item counts include all object states, unit counts are fog-of-war filtered and intentionally undercount, dead_on_map is specific, and the tool returns an error if no fort is active. This is exceptionally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence provides necessary detail, and it front-loads the core purpose. It is a single long paragraph, which could be better structured, but it is not bloated or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description thoroughly explains all return fields (fps, gfps, items breakdowns, units splits) and even clarifies their meaning relative to other tools. It also covers edge cases (error, fog-of-war) and cross-references alternatives, making it fully complete for a zero-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so parameter semantics are not applicable; baseline 4 applies. The description instead focuses on output field semantics, which adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool reports 'the fort's computational health as facts,' covering FPS, item counts, and unit counts. It differentiates itself from siblings by noting it's the only source for 'FPS death' and clarifying differences from stocks and livestock_and_pastures.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: it explains when to use this tool (for computational load, using raw item/unit counts) versus alternatives like stocks (for usable stock) and livestock_and_pastures (for unassigned_count). It also warns about fog-of-war undercounting and the error condition when no fort is loaded.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fort_statusFort statusA

One-call situational overview of the currently loaded Dwarf Fortress fort: name, in-game date and season, population, created wealth, a happiness breakdown (miserable/unhappy/content/happy), recent_deaths, and a pre-triaged list of alerts worth attention. recent_deaths covers deaths recorded AT THIS SITE within the last game year: how many were the fort's own citizens, what killed them (citizen_causes, e.g. THIRST/STARVATION/STRUCK_DOWN), how many of those citizens were slain BY another citizen (the murder/loyalty-cascade signal, which no other tool reports), and how many of the dead were outsiders rather than fort members. Citizenship is the victim's membership in the fort group, so another civilization's dwarves killed at your gate count as outsiders, not as your losses. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of explaining behavior. It thoroughly details what is returned, including the nuanced definition of citizenship and the time window for recent_deaths, and explicitly mentions the error case ('Returns {"error":"no fort loaded"}'). It does not explicitly state that it has no side effects, but the read-only nature is strongly implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose. It is a bit long, but every sentence provides necessary detail, especially the elaborated recent_deaths semantics that would otherwise be unclear. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must fully document return values. It covers all major fields (name, date, population, wealth, happiness, deaths, alerts) and goes deep on the trickiest attribute (recent_deaths), including the error condition. Given the tool's complexity, this is complete and self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is empty. The baseline for 0 params is 4. The description wisely allocates space to explaining the rich output instead of parameters, which adds no further semantic value needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb phrase ('One-call situational overview') and lists the exact resources covered (fort name, date, population, wealth, happiness, deaths, alerts). It also distinguishes itself from sibling tools by explicitly calling out the murder/loyalty-cascade signal as unique ('which no other tool reports').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly frames when to use the tool ('One-call situational overview', 'pre-triaged list of alerts') and highlights the unique murder signal, implying this is the go-to for that specific need. However, it does not explicitly state exclusions or name alternative tools for deeper dives into individual areas (e.g., threats or fort_health).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

game_dataGame dataA

Look up the LOADED WORLD's raws (ground truth for THIS world) and return curated, labeled facts. This is the authoritative source for procedural creatures (demons, forgotten beasts, titans) that never appear on the wiki. Covers six kinds via the kind filter (default creature): creature, material, plant, reaction, item, building. Pass a token (e.g. "DEMON_4", "INORGANIC:IRON", "MAKE_SOAP_FROM_TALLOW"), a name (case-insensitive substring, e.g. "flame phantom", "plump helmet"), or — for creature — a live unit_id (all digits). A single strong hit returns a full dossier for that kind; several return a disambiguation list; none returns {"match_count":0,"matches":[]}. Returns {"error":"no game loaded"} if no game is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhich raws table to search; defaults to creature. One of creature | material | plant | reaction | item | building.
queryYesA raws token or case-insensitive name fragment for the chosen kind (e.g. "IRON", "plump helmet", "MAKE_SOAP_FROM_TALLOW"); for the creature kind, a live unit_id (all digits) also resolves.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and meets it: it discloses return behavior for single vs multiple vs zero matches, specifies the disambiguation behavior, and mentions the error response. It also clarifies the source semantics ('ground truth for THIS world') and that results are 'curated, labeled facts'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then systematically builds detail: source contrast, kind coverage, query types, return outcomes, and error case. Every sentence earns its place; no filler or redundancy. The length is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool with two params and no output schema: it explains what the tool searches, how to construct queries, what the response shapes will be (dossier, disambiguation list, empty match), and error behavior. Nothing essential is left ambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds significant meaning beyond the schema: it explains the `kind` filter with a default value and enumerates the six kinds, and provides rich examples for `query` (tokens, substrings, and unit_id for creatures). This goes well beyond the schema's terse descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Look up') and resource ('the LOADED WORLD's raws'), and distinguishes from sibling tools by positioning itself as the authoritative source for procedural creatures that never appear on the wiki. It also lists the exact kinds of data covered, making the tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly contrasts with the wiki ('procedural creatures ... that never appear on the wiki'), indicating when to prefer this tool. It also provides concrete query examples and notes the default kind, giving clear guidance on how to use it. The error condition for no loaded game is also stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

geologyGeologyA

A one-call geological survey of the embark, REVEALED-INFO ONLY by default. Returns surface_z_max — the highest open-to-sky ground z-level found ANYWHERE on the embark (NOT map_overview()'s surface_z_at_core, which is the surface directly above the fort centre only; on a sloped map the two legitimately differ by many z-levels); the layer stack the fort has exposed (each band z_top..z_bottom with a kind — soil/sedimentary/metamorphic/igneous — and the in-game material names, e.g. "limestone", that game_data/wiki_lookup resolve); the aquifer (presence, light vs. heavy type, and z-range, enough to fuse with wiki_lookup("Aquifer")); the caverns actually DISCOVERED (each with z-range and whether it holds water); whether the magma sea has been reached; and surface water (brook, river, murky-pool count, and permanent_freeze — whether the biome's base temperature keeps surface water frozen year-round, glacier/tundra, the well-gating fact; not a seasonal winter claim). Undiscovered caverns and an unreached magma sea are OMITTED (fog of war stays honest). Set reveal_hidden=true to BYPASS FOG OF WAR and also surface every undiscovered cavern (caverns_hidden) and the magma sea z-range (magma_hidden) — a debug/spoiler switch, default false. Reports what is there, not where to dig. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
reveal_hiddenNoBypass fog of war: also report undiscovered caverns and the magma-sea z-range regardless of discovery. Default false (undiscovered depths omitted).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the transparency burden. It discloses default fog-of-war behavior, omission of undiscovered caverns and magma sea, the debug/spoiler nature of reveal_hidden, the error response when no fort is loaded, and clarifies that it reports what exists rather than digging directions. This is exceptionally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and long, but every clause adds unique value, such as the distinction between surface_z_max and surface_z_at_core, the meaning of permanent_freeze, and the format of layer stacks. It is front-loaded with a summary sentence and then systematically details outputs. The length is justified but could be made more scannable with bullet points.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must explain return values entirely. It does so comprehensively, covering each output category, their formats, exclusions, error handling, and the effect of reveal_hidden. This makes the tool fully understandable without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already has 100% parameter coverage, so the baseline is 3. The description adds meaningful context by explaining the reveal_hidden parameter's bypass behavior, naming the returned fields (caverns_hidden, magma_hidden), and labeling it as a debug/spoiler switch. This goes beyond the schema's description, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it performs a geological survey of the embark and enumerates specific return values (surface_z_max, layer stack, aquifer, caverns, magma sea, surface water). It also distinguishes itself from map_overview by explicitly contrasting surface_z_max with surface_z_at_core, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool versus alternatives, notably contrasting with map_overview and explaining how results can be fused with wiki_lookup and game_data. It also clarifies the default behavior and when the reveal_hidden parameter should be used, offering clear context for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hauling_routesHauling routesA

The fort's minecart hauling infrastructure: routes, each route's stops, and the vehicle (minecart) objects fort-wide. routes[] is {id, name?, stops[], vehicles[]}. Each stop is {id, name?, pos:{x,y,z}, stockpiles[], conditions[], parked_vehicle_id?} — stockpiles[] is {building_id, take, give} for every stockpile linked to that stop (take = the cart picks items up from that stockpile, give = the cart drops items into it; a link can be both). conditions[] is that stop's departure conditions — {direction, mode, timeout, load_percent, at_most, desired} — mode is how a dwarf moves the cart onward (Push/Ride/Guide), direction is the initial departure heading, and at_most/desired describe the load_percent threshold that must be met before the cart leaves. parked_vehicle_id is the vehicle currently sitting at that exact stop right now, absent if none is. A route's own vehicles[] ({vehicle_id, current_stop_id?}) is the set of vehicles assigned to run that route — DF assigns vehicles at the route level, not per stop; current_stop_id is which of that route's own stops the vehicle currently occupies, absent if in transit or unknown. The top-level vehicles[] is every hauling vehicle fort-wide (minecarts and other cart- type haulers; battering rams excluded) as {vehicle_id, item_id, backing_item_exists, route_id?, on_track} — backing_item_exists is whether the vehicle's backing item still exists (a vehicle can persist as a stale reference after its physical cart is destroyed or stolen, regardless of whether it is assigned to a route); route_id is absent for a vehicle not currently assigned to any route. Both routes[] (capped 100, see routes_total/routes_truncated) and the top-level vehicles[] (capped 200, see vehicles_total/vehicles_truncated) are sorted by id. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: returns an error if no fort is loaded, caps on routes and vehicles with truncation flags, sorting by id, and details about stale vehicle references. It covers edge cases and data semantics comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but densely informative. Every sentence contributes to explaining the complex data structure. It is front-loaded with the core concept and then details nested objects. While a bit wordy, the detail is necessary for such a complex topic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no input schema, no output schema, and no annotations, the description provides a complete picture: the overall structure of routes, stops, vehicles, nested properties, thresholds, and error conditions. It is fully self-contained for an agent to invoke and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline per rubric is 4. The description provides no parameter-level details because there are none to describe, but it thoroughly explains the return value structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to retrieve the fort's minecart hauling infrastructure, including routes, stops, and vehicles. It distinguishes itself from sibling tools by focusing specifically on hauling routes and vehicle objects, not general stockpiles or stocks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what data is returned and when an error occurs, but it does not explicitly compare itself to alternatives or state when to use this tool versus siblings like 'stockpiles' or 'work_order_list'. Usage is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

identifyIdentifyA

One-call "what is this creature and how do I handle it": fuses THIS WORLD's raws (ground truth) with the DF wiki (strategy). Pass a creature token (e.g. "DEMON_4"), a name ("flame phantom"), or a live unit_id (all digits) — same contract as game_data. Returns the creature dossier (flags, attacks, interactions — e.g. a TRAPAVOID flag means cage traps cannot hold it) plus 1-2 trimmed wiki strategy excerpts. Procedural creatures (demons, forgotten beasts, titans) have no wiki page, so strategy leans on their traits plus the most relevant trait page (fire, building destroyer). Use this instead of a bare wiki lookup so world-specific facts are never missed. Multiple matches return a disambiguation list; returns {"error":"no game loaded"} if no game is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesCreature token, name fragment, or a live unit_id (all digits)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden. It discloses return values (dossier, flags, attacks, interactions, wiki excerpts), how procedural creatures are handled, disambiguation behavior, and error behavior ('no game loaded'). It even decodes a flag example, providing rich context beyond a mere operational description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a one-line summary, then input forms, output explanation, edge cases, and an explicit alternative. Every sentence adds useful information without padding. It is appropriately detailed for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 adequately covers the tool's purpose, parameters, return values, edge cases, and comparison to alternatives. It is complete enough for an agent to select and invoke the tool correctly in a variety of scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single 'query' parameter, so the baseline is 3. The description adds value by explaining the accepted forms (token, name, unit_id) with concrete examples and linking the contract to game_data, enhancing the schema's description without being redundant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb+resource: 'fuses THIS WORLD's raws with the DF wiki' to identify creatures and provide handling strategies. It also distinguishes from siblings by explicitly saying 'Use this instead of a bare wiki lookup' and referencing game_data as a separate contract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: what inputs to pass (creature token, name, unit_id), when to prefer this tool over a bare wiki lookup, and what to expect in cases of multiple matches or no game loaded. It directly names an alternative ('wiki lookup') and explains why this tool is better.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

injuries_and_healthInjuries and healthA

The fort's medical picture, counted on CURRENT condition rather than on history. wounded = dwarves carrying at least one wound with live damage (bleeding, pain, swelling, an unset fracture, a severed part, infection). old_wounds_only = dwarves whose every wound has resolved to a scar or to an inert record — DF never deletes a healed wound, so these keep a wound entry forever and are NOT casualties. patients = dwarves the game itself flags as needing healthcare, bedridden = flagged should-not-move. unconscious counts only genuine unconsciousness: a normally SLEEPING dwarf also carries a nonzero unconscious counter, so sleepers are excluded and reported as asleep instead. care_needs breaks down what care the game is asking for (diagnosis, surgery, suture, dressing, crutch, ...) so gaps in medical coverage are visible; it is empty when no dwarf currently needs care. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It excels by explaining non-obvious behaviors: old wounds are never deleted and thus old_wounds_only dwarves are not casualties; sleepers are excluded from unconscious because they carry a nonzero unconscious counter; care_needs is empty when no care is required; and it returns an error if no fort is active. These details go far beyond the schema and provide crucial edge-case understanding.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph but is tightly packed with necessary information. It starts with the main purpose, then defines each category, explains edge cases, and ends with the error condition. Every sentence adds value and there is no redundant or filler content. It is verbose but highly efficient for the complexity it covers.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of output schema, the description must explain return values. It thoroughly explains the semantics of each field (wounded, old_wounds_only, patients, bedridden, unconscious, care_needs) and the error case, but it does not explicitly state the exact JSON structure (e.g., whether the fields are arrays of IDs or counts). This leaves a small gap, but the definitions strongly imply the format, so it is mostly complete. A 4 is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema is empty and schema_description_coverage is 100%. No parameter explanation is needed from the description. The baseline for 0 params is 4, and the description does not need to compensate for anything. It appropriately does not mention parameters, which is acceptable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides 'The fort's medical picture' with a focus on CURRENT condition rather than history. It specifically defines the resource and content, distinguishing it from any other medical-related siblings by enumerating unique categories like wounded, old_wounds_only, patients, etc. This is a specific verb+resource with clear scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: when you need the fort's current medical picture, with detailed definitions of what counts as wounded, patients, etc. It does not explicitly mention alternatives or exclusions, but the context is clear enough to infer the appropriate usage. A score of 4 is appropriate as it falls short of explicitly naming when not to use it or citing alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jobs_and_laborJobs and laborA

Workforce utilization: how many working-age dwarves are busy vs. idle (children/babies excluded from the labor pool), the idle percentage, and a ranked breakdown of what jobs the fort is currently working on. High idle can mean unassigned labor or nothing queued. cancellations aggregates recent job-cancellation OCCURRENCES (the currently-retained report buffer, roughly the last few months of play) by their reason text, sorted most-frequent first — counting occurrences, not report rows: DF collapses consecutive identical cancellations into one report and tallies the extras separately, so a reason repeating many times (e.g. "Equipment mismatch") is weighted by its true frequency, not undercounted as a handful of rows. chronicle sees the same announcements one at a time but never aggregates them. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and delivers robust behavioral disclosure. It details that cancellations count occurrences rather than collapsed report rows, mentions the retained buffer window, notes the exclusion of children/babies from the labor pool, and states the exact error response for a missing fort. This is exceptionally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but well-organized: a colon-led main clause introduces the workforce data, and a separate sentence covers cancellations and chronicle. Each sentence contributes unique value without redundancy, though the second sentence is quite long and packed with detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

In the absence of an output schema, the description sufficiently explains the return categories: workforce utilization, idle percentage, ranked job breakdown, and cancellations (with aggregation and time-window context). It also covers the error case, making the tool's behavior fully understandable without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the schema is empty and there is nothing to explain. According to the rubric, a baseline of 4 applies for zero-parameter tools, and the description appropriately introduces no parameter-related claims.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's main function: providing workforce utilization statistics (busy vs. idle), idle percentage, a ranked breakdown of jobs, and cancellation aggregations. It also explicitly distinguishes itself from the sibling tool 'chronicle' by contrasting aggregation behavior, so its purpose is unambiguous and differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives interpretive guidance for high idle ('unassigned labor or nothing queued') and draws a comparison with chronicle to help choose between them. However, it does not explicitly mention alternatives like work_order_list or provide a broader when-to-use/not-use framework, so it falls short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

livestock_and_pasturesLivestock and pasturesA

The fort's tame animal economy as facts — every prior tool sees hostiles (threats) or nothing at all here. tame_total/pets/livestock split ownership; by_group[]/by_group_total/by_group_truncated count tame animals by species/sex/adult-or-not, capped at 100 distinct combinations. grazers reports total vs pastured, plus the individual animals NOT in any pasture zone — a grazer with no pasture cannot graze and silently starves; this is normally invisible (juveniles graze too, so grazer status is NOT gated on adulthood). egg_layers reports counts only (total, fort-wide nestbox count, how many are pastured without a nestbox in reach, how many are unpastured) since the consequence (missed eggs) is mild and the population is usually large — gated on adulthood (a juvenile of an egg-laying caste cannot actually lay yet, matching DFHack's own autonestbox behavior). marked_for_slaughter and trained (training_level Trained..MasterfullyTrained — DF's single shared training-quality scale, NOT which discipline the animal was trained for; it does not persist war-vs-hunting per animal) list individual animals, capped. cages[]/cages_truncated lists occupied cages with their occupants (dfhack.buildings.getCageOccupants); each cage's own occupants[] is independently capped too (occupants_total/occupants_truncated), so a single densely-packed cage trap can't inflate the response either. unassigned_count is animals with no pasture, cage, or chain — DFHack's zone tool calls this "unassigned" (roaming loose); reported as a count only since it is commonly large and often intentional (e.g. free-roaming cats). Every unit fact here is gated through the fog-of-war visibility check — an undiscovered cavern's wildlife never leaks in. The tame-animal enumeration (tame_total/pets/livestock/by_group/grazers/egg_layers/marked_for_slaughter/trained/unassigned_count) is ADDITIONALLY restricted to this fort's own civ, so a caravan's or diplomat's pack animal is excluded; cages[].occupants[] intentionally skips that restriction — a cage's contents (which may include a captured wild or hostile creature) are a structural fact independent of ownership, still fog-of-war gated. The tame-animal enumeration also requires isActive/not isDead (a dead animal's unit record never counts). Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description thoroughly discloses behaviors: result caps (100 distinct combinations), fog-of-war gating, civ restriction, isActive/isDead requirements, and the error response when no fort is loaded. It even explains nuances like grazer status not being gated on adulthood and egg_layers counts being gated on adulthood. This fully compensates for the absence of annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but dense with essential information for a tool with no output schema. It is front-loaded with the purpose and organized by field categories. While it could be broken into clearer sections, every sentence earns its place given the complexity and the need to document edge cases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is exceptionally complete for a tool with no output schema. It explains all major fields (tame_total, by_group, grazers, egg_layers, marked_for_slaughter, trained, cages, unassigned_count), their semantics, caps, and edge cases. It even covers error conditions, making it sufficient for an agent to use correctly without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description cannot add parameter-level detail, but it thoroughly explains the output fields, which indirectly helps an agent understand what the tool returns. No parameter information is needed beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool's purpose: 'The fort's tame animal economy as facts.' It distinguishes itself from siblings by stating that 'every prior tool sees hostiles (threats) or nothing at all here,' making it the definitive tool for tame animal data. The extensive field enumeration further clarifies its scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool by noting that other tools either see hostiles or nothing here, implying this is the go-to for tame animal information. It also clarifies exclusions (e.g., caravan animals) and gates (fog-of-war), but does not explicitly name alternative tools for specific use cases beyond the initial distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mandates_and_justiceMandates and justiceA

The fort's nobility overhead as facts. Active production mandates (a noble's make-N-of-an-item quota with its remaining count and days to deadline) and export bans, listed by item. Unmet noble room demands (an appointed noble holds no room zone of a type their position requires: office, bedroom, dining, tomb). Justice state: open criminal cases, convictions awaiting punishment (prison sentences, scheduled beatings and hammerstrikes), and restraint capacity (chains + cages actually CONSTRUCTED vs. how many are free, with placed-but-not-yet-built ones counted separately in restraints_unbuilt) so you can see whether a sentence can be served. Reports what the nobles demand and the justice backlog, not what to build about it; threshold restatements are in alerts. Lists are capped (see the *_truncated flags). Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses truncation behavior (*_truncated flags), the special handling of unbuilt restraints, and the error return when no fort is loaded. It also implies a read-only nature by describing it as a reporting tool, which is transparent for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but not bloated; each sentence contributes information about a different data category or behavior. It could be better structured with bullet points, but as a single paragraph it is efficient and front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description thoroughly covers the returned data types and edge cases, including truncation flags and the error case. It lacks a sample JSON structure, but the level of detail is sufficient for a complex tool, making it fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema carries no burden. The description adds no parameter details since none exist. Baseline 4 is appropriate for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly enumerates the tool's specific content: production mandates, export bans, unmet room demands, and justice state. This distinguishes it from sibling tools like nobles_and_administrators or petitions by naming unique data groups. Although the opening sentence is a noun phrase, the rest explicitly states what is reported.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides contextual guidance by stating what it does not cover ("not what to build about it") and where to find related info ("threshold restatements are in alerts"). It stops short of naming alternative tools, but the usage context is clear enough for the agent to decide when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

map_overviewMap overviewA

Cheap spatial orientation to run BEFORE any per-tile terrain read: map extents (x/y/z tile counts), the fort-core coordinate (the same 3D citizen centroid defenses() reports), surface_z_at_core — the surface z-level directly above the fort center, i.e. the highest open-to-sky ground tile in THAT ONE COLUMN, or null if the core is not under open sky (this is NOT geology()'s surface_z_max, which is the highest open-to-sky ground tile anywhere on the embark; on a sloped map the two legitimately differ by many z-levels, so pick the one you mean) — the z-levels that carry player activity (construction and pending digging, listed separately and as a union), and stairways collapsed to traversable single-column vertical runs (x, y, z_top, z_bottom); a run only spans levels that actually connect by DF stair rules, so a helical shaft splits into its climbable segments. The payload is fixed-size regardless of fort size: activity is a set of z-levels, never per-tile, and stair columns are RANKED BY HEIGHT (tallest run first) then capped, so when a fort exceeds the cap the tallest shafts survive and only trivial fragments are dropped (stair_columns_truncated flags the overflow; stair_columns_total gives the full count). Fog-of-war honest: undiscovered tiles never leak. Use it to decide which z-levels and area to pull grids for. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behaviors: 'Cheap' (performance), 'fixed-size payload regardless of fort size', stair columns 'RANKED BY HEIGHT' then capped with truncation flag and total count, fog-of-war honesty ('undiscovered tiles never leak'), and the exact error response when no fort is loaded. This is exceptionally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries critical semantic weight, explaining nuanced edge cases (surface_z vs geology, helical shaft splitting, cap ordering, fog-of-war). It uses structured lists and parentheticals effectively, staying organized despite the detail. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema provided, the description must explain all return values, and it does comprehensively: extents, centroid, surface_z_at_core (with null case), activity z-levels, stair columns (with ranking/truncation metadata), and error behavior. It also covers performance and honesty characteristics, making the tool fully understandable without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no schema to clarify. The baseline for 0-param tools is 4, and the description correctly omits parameter details since none exist. The behavior descriptions are entirely self-contained for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description immediately states the tool's specific purpose: 'Cheap spatial orientation to run BEFORE any per-tile terrain read.' It enumerates exact outputs (map extents, fort-core coordinate, surface_z_at_core, activity z-levels, stairways) and explicitly distinguishes itself from sibling tools like geology() and defenses(), making its role unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided: 'run BEFORE any per-tile terrain read' and 'Use it to decide which z-levels and area to pull grids for.' It also clearly contrasts with geology()'s surface_z_max, warning against confusion and telling the user to 'pick the one you mean.' This gives both when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mechanismsMechanismsA

The fort's lever/pressure-plate wiring as facts — players (and an AI co-pilot) routinely forget which lever raises which bridge; this makes it legible. levers[] lists every lever with its position, current state (0/1 — the physical orientation, NOT which way any linked gate is), linked_targets (every building its mechanism items connect to — bridge/door/floodgate/hatch/support/weapon-trap — with that target's id, type, position, and a state string (raised/lowered/raising/lowering for a Bridge, closed/open/closing/opening for a Floodgate, closed/open (no transitional state) for a Door/Hatch, retracted/unretracted/retracting/unretracting for a Weapon spike) when the target exposes one), and pending_pull_jobs (PullLever jobs already queued on it, so a caller can see a pull is already in flight before queuing another). pressure_plates[] lists every plate's linked_targets the same way, plus triggers — the configured trip conditions (citizens, creatures with a weight range, a minecart-weight range on track, or water/magma depth ranges). unlinked_levers is the ids of levers wired to nothing (dead ends); unlinked_bridges is bridges no lever or plate in the fort currently operates (must be hand-opened/closed, or are permanently fixed). levers[]/pressure_plates[]/unlinked_levers[]/unlinked_bridges[] are each capped at 200 (id-sorted) with their own *_truncated flag — lever_count/plate_count/bridge_count are always the true totals regardless of truncation. Pairs with the pull_lever actuator. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it distinguishes physical lever orientation from linked gate state, details the structure of linked_targets and state strings, explains truncation caps and the always-true totals, and includes the error response for no fort. This is exceptionally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a dense single paragraph, but every clause delivers necessary behavioral detail. It lacks visual structure like bullet points for scannability, but it front-loads the purpose and has no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, no annotations, and zero parameters, the description is exceptionally complete. It covers all major output fields, state semantics, truncation behavior, and error handling, leaving little ambiguity for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description doesn't need to explain parameters and instead focuses on output structure, which is appropriate. No undocumented parameters need compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool presents the fort's lever/pressure-plate wiring as factual data, and it explicitly says 'levers[] lists every lever' and 'pressure_plates[] lists every plate's linked_targets'. This distinguishes it from sibling tools by focusing specifically on mechanisms, and it even notes its pairing with pull_lever.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool—when players/AI forget which lever controls what, and before queueing a pull to check for pending jobs. However, it does not explicitly discuss when not to use it or name alternative tools for other fort information, so it lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

militaryMilitaryA

The fort's military: number of squads, how many living present dwarves are actually enlisted (soldiers), filled squad positions, and readiness read against hostiles currently on the map (great-danger split out). Each squad also reports: roster[] — one row per FILLED position whose occupant is a LIVING, PRESENT unit (a dead or off-map holder still counts toward filled but is omitted here, so gear sitting on a corpse never generates a false alert) — that soldier's uniform_complete flag, and (only when incomplete) uniform[], aggregated by item type (ARMOR/HELM/PANTS/GLOVES/SHOES/SHIELD/WEAPON/...) into assigned_count (items the uniform calls for — a required-but-never-found item still counts as 1) vs missing_count (of those, how many are not currently worn/wielded — DF's own uniform-unstick logic, or never assigned at all) — this is the tool-API spec's originally-promised "equipment_gaps" (e.g. "8 of them have no armor"), previously unfulfilled; a fully-equipped soldier's uniform[] is empty (uniform_complete says so already) to keep the payload proportional to actual gaps, not fort size. ammo — the squad's configured ammunition specs (item type, target_amount — the squad's shared configured total, NOT per-soldier — and how many are currently assigned) and ammo_items_assigned, the total ammo items currently carried by the squad; training — the active training-schedule month's sleep_mode, uniform_mode, and active_orders (both undefined/empty when the fort has never customized that routine's month). alerts also flags any roster member with an incomplete uniform by name. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and exceeds expectations. It discloses nuances such as roster excluding dead/off-map units, uniform aggregation logic (assigned vs missing), ammo target being a shared total not per-soldier, training schedule behavior, and an error response when no fort is loaded. This is extensive behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose and presented as a single dense paragraph, which can be harder to scan. However, each sentence provides necessary detail and the length is justified by the complexity of the returned data. It is not maximally concise but is appropriately detailed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description fully specifies the return structure, including edge cases, error handling, and the meaning of each field. It covers all aspects of military data comprehensively, making it complete 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the description does not need to add parameter semantics. According to the rubric, 0 parameters receives a baseline of 4, which is appropriate here since no further detail is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: it returns the fort's military information, enumerating squads, enlisted dwarves, filled positions, readiness, roster details, uniforms, ammo, training, and alerts. It is specific to the military domain and the content distinguishes it from siblings like 'threats' or 'defenses' without needing explicit mention.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on what data is returned, making it obvious when to use the tool. However, it does not explicitly mention alternatives or exclusions, so it falls short of the highest rating. For example, it doesn't say 'for threats use threats tool'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

moodsStrange moodsA

Any active strange mood (fey/secretive/possessed/macabre/fell) and its material countdown. For each moody dwarf: the mood type, the driving skill, the workshop claimed (or that none is yet, via workshop_status: unclaimed/gathering/working), the raw mood countdown, and every demanded material cross-referenced against fort stock — needed, gathered so far, and how many the fort actually has (have). The early warning is "demands bones, fort has zero": it reports the demand vs. the stock, not what to go collect. Returns {"active":[]} when no strange mood is in progress (the common case), and {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries full burden. It discloses return value structure, edge cases (empty active, error), and clarifies the distinction between demand and stock ('it reports the demand vs. the stock, not what to go collect'). This adds meaningful behavioral context beyond a simple listing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but each sentence adds value: the first gives the core purpose, the second details output fields, the third explains a use case, and the fourth covers edge cases. It's structured clearly with a colon, but could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully specifies return values including structure, statuses, and error cases. It addresses the common case and error condition, making it complete for a read-only status tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, and the schema coverage is 100%, so a baseline of 4 is appropriate. The description does not need to explain parameter semantics because there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's scope ('Any active strange mood ... and its material countdown') and enumerates all mood types. It also differentiates from sibling tools by focusing exclusively on strange moods, a unique concern not addressed by nearby tools like fort_health or jobs_and_labor.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies monitoring use through the 'early warning' phrase but never explicitly states when to use this over alternatives. It doesn't mention exclusions or alternative tools, though the uniqueness of the subject matter reduces the need.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nobles_and_administratorsNobles and administratorsA

The fort's appointed positions (manager, bookkeeper, broker, chief medical dwarf, sheriff, expedition leader/mayor, militia commander/captain, hammerer, and any higher noble the site has grown into) as facts: each position's holder(s) or vacancy — each holder always carries histfig_id, plus unit_id when that historical figure has a loaded unit on this map (a holder living off-map still has no unit_id). A vacant position is a common, otherwise-invisible cause of "why won't this validate" — work_order_create needs a manager, trade needs a broker, mandates_and_justice punishments need a hammerer. superseded_by names the position a role hands its responsibilities to once filled (e.g. sheriff -> captain of the guard, expedition leader -> mayor) — a vacancy there is often expected, not a problem. Also reports the bookkeeper's precision level (0-4, higher = more accurate stock counts, set on the Nobles screen), whether a mayoral election is currently forced/pending, and whether the civilization's monarch has arrived at the site (and if so, hastily). Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It thoroughly discloses edge cases (off-map holders lacking unit_id, expected vacancies via superseded_by), additional data (bookkeeper precision, election state, monarch arrival), and error behavior (returns error if no fort is loaded). This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph, but it covers a complex set of roles, semantics, and practical use cases. Each clause adds value, and the opening sentence clearly states the core purpose. While a bulleted list could improve scannability, the content is appropriately sized for the tool's richness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must fully explain return values. It does this comprehensively: the structure of facts, the meaning of histfig_id and unit_id, the bookkeeper precision scale, pending elections, monarch arrival, and the error response. It also covers common misinterpretations (vacant superseded_by is normal). Complete for a zero-parameter informational tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is trivially 100% and there is nothing for the description to add at the parameter level. A baseline of 4 is appropriate for parameterless tools; the description's focus on output interpretation is more relevant and handled under other dimensions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('reports'), identifies the resource ('the fort's appointed positions'), and enumerates the exact role hierarchy, making it clearly distinct from sibling tools. It goes beyond a simple label by describing what facts are returned and how to interpret them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly ties vacancies to concrete validation problems: 'work_order_create needs a manager, trade needs a broker, mandates_and_justice punishments need a hammerer.' This gives strong contextual cues for when to query this tool. However, it does not explicitly discuss when not to use it or mention alternative sibling tools by name, falling just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

petitionsPetitionsA

The fort's outstanding agreements as facts: location petitions (temple/guildhall requests from a deity's worshippers or a guild) and residency/citizenship petitions (a migrant or visitor asking to join the fort), each with its petitioner, agreed date, and resolution status. location_petitions[] carries building (TEMPLE/GUILDHALL), tier (1 = temple/guildhall, 2 = complex/grand), the petitioning deity (temple) or guild profession (guildhall) when one was named, age_days since the petition was raised, and warned_ready (the fort has already been told the location can be established — a still-outstanding petition with warned_ready true is the classic silent-failure case: agreed to but never actually zoned). residency_petitions[] carries kind (Residency/Citizenship), age_days, and deadline_days (days left before the petitioner's patience runs out, null if no timeout is tracked). Both carry awaiting_decision (true if the petition sits in the fort's pending decision queue right now) and status (outstanding/satisfied/denied/expired, derived from the agreement's own flags — see the doc for how this maps to DFHack fields). This is the demand-fulfillment counterpart to rooms_and_zones's temple/guildhall inventory (needed_by_worshippers there is inferred from citizen worship with no formal petition yet; a row here is an actual agreement DF is tracking) — compose the two rather than expecting either to duplicate the other. Lists are capped at 50 each (see the *_truncated flags). Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains output semantics: the meaning of warned_ready, deadline_days, status derivation from flags, truncation at 50 items with *_truncated flags, and the error response when no fort is loaded. This is exemplary transparency, exceeding what annotations would likely provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though the description is long, every sentence is informative and necessary. It is front-loaded with the core purpose, then methodically covers field semantics, associations, limits, and errors. The structure flows logically from general to specific, and there is no redundancy or filler. It is appropriately sized for the complexity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the extensive data model (two petition types, many fields, derived statuses, truncation flags) and the absence of an output schema, the description is remarkably complete. It explains not only what is returned but also how to interpret edge cases (e.g., warned_ready true with outstanding status, null deadlines, truncated lists). It also contextualizes the tool within the fort's broader analysis, mentioning the relationship to rooms_and_zones. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description cannot add parameter-specific meaning. The baseline for 0 parameters is 4, and the description does not need to explain parameters. It does, however, provide extensive detail about the returned data, which is more than expected. There is no gap in this area.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to list the fort's outstanding agreements as facts, specifically location petitions and residency/citizenship petitions. It uses specific verbs and resources ('location petitions', 'residency/citizenship petitions') and distinguishes itself from the sibling tool rooms_and_zones by explicitly noting the difference in how needs are tracked. This is far beyond a vague restatement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly positions the tool relative to rooms_and_zones, stating they are complementary and should be composed rather than expecting either to duplicate the other. It also provides context on when this tool is relevant (actual agreements tracked by DF vs inferred needs). This gives clear guidance on when to use this tool vs alternatives, and even flags the classic silent-failure case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rooms_and_zonesRooms and zonesA

The fort's facility inventory, each count paired with its demand-side number where one exists: bedrooms (assigned/unassigned vs. adults without one), dining halls and seats, the hospital (beds, traction benches, whether a well is inside, and medical supplies physically stocked), wells (working state and water source: water/frozen/magma/unknown), temples (dedicated deities, whether an all-inclusive temple exists, and deities worshipped by citizens that lack a dedicated temple), taverns, libraries, guildhalls, and coffins free vs. dead awaiting burial (loose corpses of the fort's own race). ghosts reports active apparitions currently on the map (active[], fog-of-war gated) plus unquiet_dead_count — this civ's dead who are world-flagged as unquiet ghosts (flags.ghost) and NOT represented in the visible active[] list. This is deliberately not the same as "confirmed absent locally": a ghost hidden behind fog of war is excluded from active[] (never leaked) but still counted here, since the world-level ghost fact is fair game even when its exact location isn't. The supply-side companion to unmet_needs(). Reports what the fort has, not what to build. Wells are capped (wells_truncated flags the overflow); bedroom and coffin detail is aggregated to counts. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description discloses critical behavioral traits: well truncation flag, aggregation of bedroom/coffin counts, ghost visibility rules (fog-of-war gated active[] vs world-flagged unquiet count), and the error condition when no fort is loaded. This goes well beyond minimal requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries substantive information about data categories or edge cases. It could benefit from bullet points, but the single-paragraph structure is acceptable given the tool's complexity and the need to explain nuanced behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description must carry the full burden, and it does. It covers all data categories, explains the ghost counting logic in depth, notes truncation, and specifies the error case. It is fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description thoroughly explains what the output contains, which is the main semantic burden; no parameter descriptions are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports the fort's facility inventory with specific categories (bedrooms, dining halls, hospital, wells, temples, etc.) and explicitly positions it as the supply-side companion to unmet_needs(), distinguishing it from that sibling. The scope is precise and detailed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the companion tool unmet_needs() and clarifies that it 'Reports what the fort has, not what to build', providing clear when-to-use and what-not-to-use guidance. This directly helps an agent choose between alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

site_historySite historyA

This fort's entry in the PERMANENT world saga (the durable history event log, not the pruned live report stream). Returns the founding (year, in-game date, and owning civilization in both Dwarven and English), the fort name in Dwarven and English with a word-by-word etymology, prior sieges/battles fought AT this site (attacker/defender civ and general, capped at 20, most-recent-first), and the notable historical figures who died here (name, race, cause, slayer, capped at 25). Scoped strictly to the loaded site. A young fort with no war history degrades to empty battle/death lists (not an error). Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses caps (20, 25), ordering (most-recent-first), degradation to empty lists, and the error response. It does not explicitly state 'read-only,' but the return-oriented language and lack of side-effect description imply a safe query.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core identity. It packs many details (fields, caps, order, edge cases) efficiently, though a structured list would improve scannability without losing content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description fully enumerates what is returned, including field groups, ordering, caps, and error cases. It also covers young-fort degradation and the no-fort error, making it complete for a read-only query tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description adds no parameter details (none exist) but compensates by thoroughly describing the output context, making the tool's behavior unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as retrieving the loaded fort's permanent world saga entry, listing exact data types (founding info, name etymology, sieges, deaths). It distinguishes itself from the 'pruned live report stream' and sibling tools like chronicle by emphasizing durability and scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It specifies the tool is scoped to the loaded site and contrasts the permanent saga with the live report stream, giving context on when to use it. It also notes error/degradation behavior for no fort or young forts, but stops short of explicitly naming alternative 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.

stockpilesStockpilesA

The fort's hauling/logistics picture: every stockpile as a fact sheet, plus fort-wide backlog signals stockpiles alone don't surface. piles[] is one row per stockpile building: id, exact bounds (x1/y1/x2/y2/z — the bounding box; an irregularly-shaped pile's real footprint can be smaller, see size), size (the pile's real tile count — for an irregular pile this reads its room.extents occupancy map rather than the bounding box, so holes/excluded tiles are correctly excluded), categories[] (which of the 17 top-level stockpile groups this pile accepts — animals/food/furniture/corpses/refuse/stone/ammo/coins/bars_blocks/gems/finished_goods/leather/cloth/wood/weapons/armor/sheet; note Ore has no flag of its own in DF's own stockpile_group_set — it rides under stone — and Misc (organic/inorganic) is a refuse sub-filter, not a top-level category, so neither appears in this list), barrels_allowed/bins_allowed (the pile's max_barrels/max_bins > 0 — DF stores 0 there specifically to mean "no containers of this kind," not "unlimited"), max_wheelbarrows (raw count; 0 here means no wheelbarrow is assigned so DF queues one haul job per item, NOT "wheelbarrows disallowed" — this one has no allowed/disallowed reading, unlike barrels/bins), links_only (DF's own "take from links only" toggle), give_to[]/take_from[] (ids of stockpiles this pile explicitly feeds into / pulls from via the g/q-t hauling-route UI, each capped at 50 with its own _truncated flag), item_count (exact count of non-rotten/non-dump/non-forbidden/non-construction/non-trader items physically sitting on the pile's tiles right now — via each item's resolved position, so items inside a bin or barrel parked on the pile count too — regardless of whether the pile's own categories[] actually accept that item, since this is a positional fact, not a settings-compliance check), and occupied_tiles (how many of the pile's size tiles have at least one qualifying item on them right now — a directly-counted fact, bounded [0, size], NOT a percentage or a capacity estimate: an earlier draft derived a fullness_pct from a placeholder items-per-tile constant that produced numbers with no real relationship to DF's actual per-tile capacity (which varies by item size and container packing — a barrel-heavy tile can hold far more than one item) and was dropped as a fabricated fact; occupied_tiles/size is a defensible coverage ratio if you want one, but it is spatial coverage, not capacity headroom). Fort-wide: unstored_backlog[] groups loose items (on the ground, not rotten/dump/forbidden/under-construction/trader-owned, and not sitting on ANY stockpile's tiles) by their raw DF item type token, with unstored_backlog_item_count as the grand total and a 150-distinct-type cap; this is the hauling backlog the issue asks for. rotting_outside_stockpiles is the same idea for the ROTTEN subset specifically (food/organic matter that has already decayed while lying outside any stockpile, i.e. hauling arrived too late) — {count, by_type[], by_type_truncated}. dump_flagged_count is an exact, unfiltered count of every item currently designated for dumping, wherever it sits. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so thoroughly. It discloses nuanced behaviors: bounding-box vs. real footprint, the exact meaning of barrels_allowed/max_bins (0 means no containers, not unlimited), the distinct reading of max_wheelbarrows, category omissions, item_count being positional and including container contents, occupied_tiles being a direct count not a percentage, and the error response. It even documents a discarded draft field as fabricated, demonstrating exceptional transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear summary and then systematically details each returned field in a logical order (piles[] fields, then fort-wide fields). It is long, but most sentences convey essential caveats or exact semantics. Some historical notes, like the dropped draft's placeholder constant, are slightly extraneous but still support transparency, so it earns a 4 rather than a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema, so the description must explain the full return shape, and it does: every field is named with its type, meaning, and edge cases, plus the error condition. Fort-wide summaries, truncation flags, and exact counting rules are all covered, making the description self-sufficient for an agent to understand what the tool returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is vacuously 100%, so there are no parameter semantics to document. Per the rubric, a zero-parameter tool receives a baseline of 4, and there is no additional parameter behavior to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool as returning 'the fort's hauling/logistics picture' with per-stockpile fact sheets plus fort-wide backlog data, which are distinct from what stockpile settings alone provide. It specifies exact fields and explicitly addresses a stated need ('the hauling backlog the issue asks for'), giving it a precise scope beyond the mere title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: to inspect stockpile configurations and hauling backlog, especially loose-item backlog, rotting items outside stockpiles, and dump-flagged counts. It does not explicitly name sibling alternatives like hauling_routes or stocks, but it provides clear context for its purpose and notes what it uniquely surfaces ('signals stockpiles alone don't surface').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stocksStocksA

Food and drink as estimated days-of-supply for the current population, plus counts of critical materials (wood, fuel, cloth, tanned hides, stone) and lists of notably low or high stocks. Days-of-supply assume ~2 food and ~5 drink per dwarf per season. clothing reports the citizens wearing worn (wear >= 2 — "X" heavily-worn/threadbare, or "XX" tattered/mangled; DF's own 4-stage scale is item -> x-item-x -> X-item-X -> XX-item-XX -> destroyed) shoes/armor/pants/gloves/helm — a chronic, easy-to-miss stress source — and how many citizens currently have no shoes worn at all (a count, since the population involved is usually the whole fort). Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral details: estimation assumptions (2 food/5 drink per dwarf per season), the wear scale (4-stage), and the error response when no fort is loaded. It also explains the count of citizens with no shoes, adding context beyond a simple output list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat verbose, especially the detailed explanation of the wear scale, but every sentence serves a purpose in clarifying output. It front-loads the main purpose and then provides necessary assumptions and error handling, making it appropriately structured for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the zero parameters, no annotations, and no output schema, the description is remarkably complete. It covers all major return elements (food/drink, critical materials, stock lists, clothing) and error behavior, leaving little ambiguity for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the baseline is 4. The description doesn't need to explain parameters, but it does add context about the output (days-of-supply, counts, clothing) that helps interpret the tool's behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: it reports food/drink days-of-supply, critical material counts, notably low/high stocks, and clothing wear status. It uses specific verbs and resources, and the focus on days-of-supply and worn clothing distinguishes it from siblings like 'stockpiles'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool, such as monitoring food/drink supply, critical materials, and worn clothing as a stress source. It lacks explicit exclusions or alternatives, but the intended use cases are strongly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threatsThreatsA

Dangerous units currently on the map, grouped by creature type. Separates ACTIVE hostiles from CONTAINED ones (caged/chained), flags great-danger creatures (megabeasts, titans, demons, forgotten beasts), invaders, and the undead, and returns a pre-triaged alerts list. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses grouping behavior, separation of active/contained threats, flags for specific danger types, and the pre-triaged alerts list. It also states the error response for no active fort, providing useful context beyond static schema fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and efficiently packs key information: the resource, output grouping, classifications, and error handling. It is front-loaded and every sentence contributes meaning, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and zero parameters, the description is complete for a list-returning tool. It explains the return content, categorizations, and error case, making it self-contained and sufficient for an agent to know what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, so the baseline is 4. The description is not required to explain parameters, and it does not add parameter-related detail. The score reflects that no parameter documentation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists dangerous units on the map, grouped by creature type, and details the specific distinctions it makes (active vs. contained, great-danger flags, invaders, undead). This is a specific verb+resource description that distinguishes it from sibling tools like 'military' or 'fort_status'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for assessing map threats but does not explicitly state when to use this tool versus alternatives or provide exclusions. It lacks a 'use this when' or 'for X, use sibling' note, but the detailed behavior helps infer its purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tile_regionTile regionA

A bounded window of ONE z-level rendered as an ASCII character grid plus a self-describing legend (every response carries the legend for exactly the glyphs it uses). Renders terrain shape (undug stone #, undug soil ",", dug floor ., ramps r/v, up/down stairs </>/x, fortifications F, trees T), constructed floor +, water ~ and magma %, and building footprints collapsed to FOUR CLASSES — workshop/furnace W, stockpile S, machine M, furniture n — never per-building detail. The grid glyph is depth-blind; a separate sparse liquids list carries per-tile [{x,y,type,depth}] (flow_size 1..7). Undiscovered tiles are ? (fog of war) and are NEVER painted over. All five parameters are OPTIONAL: with none, returns a fixed DEFAULT 60x40 window centered on the fort core (the busiest citizen z-level and that level's citizen centroid); pass z alone to recenter on THAT level's own citizen centroid; pass z,x0,y0,x1,y1 for an explicit rectangle. The window is hard-capped at 100x100 per side — an oversized request is CLAMPED (never errored) with truncated:true and the original size echoed in requested. Facts only: it renders the map, it does not design or suggest layouts. Read-only. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
zNoz-level to render; defaults to the busiest citizen level
x0Nowindow corner X (with y0,x1,y1 for an explicit rectangle)
x1Noopposite window corner X
y0Nowindow corner Y
y1Noopposite window corner Y

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description fully carries the burden and excels: it discloses the clamp at 100x100 with truncated:true, the separate sparse liquids list, fog-of-war tiles never painted over, the self-describing legend, and the 'no fort loaded' error. It also clarifies that the grid is depth-blind. This is far more than typical behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place. It is front-loaded with the core purpose, then systematically covers glyphs, liquid data, fog of war, optional parameters, clamping behavior, facts-only nature, read-only status, and error handling. There is no fluff or redundancy; the density is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description must explain return values and edge cases. It does: it describes the legend, the grid contents, the liquids list, the truncated/requested fields, the default window, and the error case. The description offers a complete mental model for an agent to use the tool safely and effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds substantial meaning beyond the schema: it explains that all parameters are optional, what the default 60x40 window is, how passing z alone recenters on that level's centroid, and how an oversized request is clamped. This enriches the parameter semantics significantly, making it worthy of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'A bounded window of ONE z-level rendered as an ASCII character grid plus a self-describing legend.' This clearly distinguishes it from sibling tools like map_overview or environment, and it goes on to enumerate exactly what is rendered and what classes of buildings are shown.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool, including default behavior with no parameters, optional z-level focusing, and explicit rectangle selection. It also states exclusions: it is read-only, facts-only, never suggests layouts, and never shows per-building detail. However, it does not name alternative tools or directly contrast with them, stopping short of the explicit alternatives guidance needed for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tradeTrade and caravansA

The trade picture right now: whether a trade depot exists, is complete, and is wagon-accessible (DF's own pathability check, not merely built); which caravans are present and their lifecycle state (none / approaching / at depot / leaving, with days remaining where knowable) and civ; whether a broker is assigned, present, at the depot, and their current job; and the count and approximate value of goods staged in the depot. Each caravan also reports manifest (count, approximate value, and a by-category breakdown of goods the caravan itself is carrying, before anything is unloaded to the depot — distinct from goods_at_depot) and agreements (active liaison price agreements as price_pct_min/max, 100 = no markup, e.g. 200 = double price: export rows are items this fort earns a bonus selling to the caravan, by DF's item type; import rows are items this fort pays a premium buying from the caravan, by DF's own request-tab category — a different, coarser taxonomy than item type, so the two lists will not line up 1:1). If reading either one fails against a real caravan (a field-path or calculation error, not simply "nothing to report"), that caravan's row carries manifest_error/agreements_error (the raw error string) instead of the field, so a live check can tell a genuine bug apart from an empty result. Reports the state and the numbers, not what to trade. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It clearly discloses error behavior ('returns error if no fort loaded', manifest_error/agreements_error for genuine bugs), and clarifies that manifest is before unloading. It does not explicitly state read-only/no-side-effects, though it is implied by the reporting nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: it opens with an overview of the main report elements, then details each caravan's additional fields, explains error handling, and ends with the error return. No sentences are wasted; it is appropriately sized for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description fully takes on the job of explaining return values. It covers not only the top-level state but also nested manifest and agreement structures, their distinct taxonomies, and failure modes. This is complete enough for an agent to know exactly what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema reflects that with an empty properties object. Per the rubric, a baseline of 4 applies; the description need not add parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is highly specific, enumerating the exact aspects of trade status it reports (depot existence/accessibility, caravan lifecycle, broker status, staged goods, manifests, agreements). It uses a clear verb 'Reports' and resource 'the trade picture', and the 'not what to trade' line distinguishes it from advisory tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on what data is available, and explicitly includes a when-not ('not what to trade') exclusion. However, it does not name alternative sibling tools or state explicit conditions like 'use this when you need current caravan state'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unmet_needsUnmet needsA

Why the fort is stressed: the dwarven needs system aggregated across all citizens. Returns the top unmet needs (e.g. prayer, drink, socializing) ranked by how many dwarves are distracted, each with the worst focus level (how starved the need is), plus how many dwarves have at least one unmet need. Reading worst_focus: it is DF's raw focus_level — 0 is neutral, positive means recently satisfied (caps at 400), negative means starved. There is NO single floor: the minimum is -16320 x that dwarf's need_level for that need, so a level-1 need bottoms out at -16320, a level-2 need at -32640, a level-5 need at -81600. An identical worst_focus repeating across several needs is therefore normal — those needs share a need_level and are all fully starved — not a clamp or a quantization artifact; and a larger magnitude on one need does not by itself mean it is more starved than another, since the two may have different floors. Compare against the floor, not against zero. Reports which needs are unmet, not how to fix them (look that up or reason from the need type). Complements fort_status happiness. Returns {"error":"no fort loaded"} if no fort is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and excels: it explains the meaning of worst_focus, the exact floor calculation (-16320 × need_level), that identical values are normal, how to compare against floors, and the error response when no fort is loaded. This prevents misinterpretation and is highly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although lengthy, every sentence is purposeful: it front-loads the purpose, then details necessary interpretation details (floors, clamps, comparative semantics), and ends with scope and error handling. The structure is logical and free of fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a read-only lookup with no inputs, no annotations, and no output schema. The description fully explains what is returned, how to interpret the numbers, and the error case, making it completely adequate for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are 0 parameters, so the schema is fully covered and description does not need to elaborate. The description provides abundant context about the return value semantics instead, which is the relevant behavioral information for this tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns aggregate unmet needs across all citizens, with a specific verb ('Returns') and resource ('dwarven needs system'). It distinguishes itself from related tools by noting it complements fort_status happiness and explicitly says it reports which needs are unmet, not how to fix them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context ('Why the fort is stressed') and clarifies that it complements fort_status happiness, but it does not explicitly name alternative tools or state when not to use it. It does say it reports unmet needs rather than fixes, implying its scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wiki_lookupWiki lookupA

Fetch a Dwarf Fortress wiki article as clean, readable text, pinned to the DF2014 namespace. Follows redirects (multi-hop) and honors section fragments (e.g. "Weapon trap" resolves to the Weapon Trap section of the Trap page). Cache-first to disk (~30-day TTL); pass refresh:true to bypass. Pure HTTP — works without the game running. Returns {title, url, text, from_cache, resolved_from?} or {error} if the page is not found.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesArticle title or topic (namespace optional)
refreshNoBypass the disk cache and refetch
sectionNoSection/heading name to scope to

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers extensively. It discloses multi-hop redirect following, section fragment resolution, disk cache with 30-day TTL, refresh bypass, pure HTTP operation without the game, and the exact return payload shape including error case for not-found pages. This is exemplary behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the primary action, then layers in behavioral nuances in a logical order: redirects/fragments, caching, operational dependency, and return format. Every sentence carries distinct information with no redundancy or filler, achieving high information density in a compact form.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description fully specifies the return object and error behavior. It covers all major context needed to invoke the tool: article title, section scoping, cache behavior, and runtime independence. The tool's complexity is well-addressed, and it stands clearly apart from the sibling wiki_search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides descriptions for all three parameters (100% coverage), so the baseline is 3. The description adds meaningful context beyond the schema by explaining how refresh bypasses the cache and by giving a concrete example of section fragment resolution ('Weapon trap' to the Trap page section), which helps the agent understand the section parameter's behavior more intuitively.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Fetch a Dwarf Fortress wiki article as clean, readable text,' clearly distinguishing this from the sibling tool wiki_search by focusing on retrieval of a specific article rather than search. It also specifies the DF2014 namespace scope, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: to get a clean-text version of a wiki article, with redirect and section handling, and works without the game running. It does not explicitly name alternatives or say 'use wiki_search instead for fuzzy lookups,' but the fetch-vs-search distinction is implicit and sufficient for an agent to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

work_detailsWork detailsA

List the fort’s work details (the labor-management groups) as facts: each detail’s name, mode (OnlySelectedDoesThis / EverybodyDoesThis / NobodyDoesThis / Default), the labor tokens it enables, and its assigned citizens. The member list is id-sorted and capped at 200 per detail — member_count is always the full count and members_truncated flags when the list is capped; member_names gives readable names parallel to members. Both parameters are OPTIONAL narrowing: detail (exact name) returns ONLY that detail; members_after (a unit id) starts each member list after that id — a truncated detail carries members_cursor (its last listed id) to pass back as members_after for the next page. READ-ONLY and always available (not behind the actuator gate); also the readback sensor for assign_work_detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNoexact work detail name — return ONLY that detail, e.g. "Miners"
members_afterNomember-list cursor: list members with id AFTER this (use members_cursor from a truncated response)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully covers behavioral traits: READ-ONLY, availability (not behind actuator gate), member list cap at 200, member_count always full, members_truncated flag, and cursor-based pagination with members_cursor. This is comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence earns its place, explaining the output fields, truncation, and pagination. It is front-loaded with the core purpose but could perhaps be tightened without losing critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description thoroughly explains the return facts (name, mode, labor tokens, assigned citizens), the pagination behavior, and the parameter semantics. It is self-sufficient for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant meaning: the detail parameter is exact-match and returns only that detail, with example 'Miners'; members_after is a cursor tied to members_cursor from a truncated response. This elevates beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('List') and resource ('fort’s work details' / labor-management groups), and enumerates the output fields. It does not explicitly distinguish from sibling tools like jobs_and_labor, so it misses the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it's READ-ONLY, always available, and serves as the readback sensor for assign_work_detail. It explains optional narrowing parameters and pagination, but does not explicitly say when to choose this over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

work_order_listWork order listA

List the fort’s active manager (work) orders as facts: id, job type, output item/material tokens, amount total/left, repeat frequency, bound workshop, condition count, and per-order validation state (active + validated; validated:false means the order cannot currently be fulfilled). Also reports whether a manager noble is assigned. count is the fort total; the page is sorted by id and capped at 256 — when capped, truncated:true and next_cursor gives the after_id for the next page. READ-ONLY and always available (not behind the actuator gate); also the readback sensor for work_order_create / _cancel.

ParametersJSON Schema
NameRequiredDescriptionDefault
after_idNopagination cursor: return only orders with id greater than this (from next_cursor)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility. It discloses READ-ONLY behavior, pagination limits (cap 256, truncated flag, next_cursor), and explains the validation state meaning, offering comprehensive behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, followed by necessary details on returned fields and pagination. While dense and efficient, the field list is long and could be more compact, but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description enumerates all returned fields, explains validation semantics, and covers pagination and availability. It's fully self-contained for an agent to understand what to expect and how to handle results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes after_id, and the description adds value by explaining the pagination flow (sorted by id, cap, next_cursor). This goes beyond the schema's bare parameter description, reinforcing usage context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List'), names the resource ('fort's active manager (work) orders'), and enumerates the returned fields (id, job type, output tokens, amounts, etc.), making its purpose unambiguous and clearly distinct from siblings like work_details or jobs_and_labor.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states this is the readback sensor for work_order_create/_cancel and that it's always available, giving clear when-to-use context. It doesn't explicitly contrast with alternative tools, but the purpose is specific enough that use cases are well implied.

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.

  1. 37 tool updatesv1.4.1
    • First observedartifacts_and_engravings
    • First observedburrows
    • First observedchronicle
    • First observedcitizen
    • First observeddefenses
    • First observedenvironment
    • First observedfarming
    • First observedfind_unit
    • First observedfluids
    • First observedfort_health
    • First observedfort_status
    • First observedgame_data
    • First observedgeology
    • First observedhauling_routes
    • First observedidentify
    • First observedinjuries_and_health
    • First observedjobs_and_labor
    • First observedlivestock_and_pastures
    • First observedmandates_and_justice
    • First observedmap_overview
    • First observedmechanisms
    • First observedmilitary
    • First observedmoods
    • First observednobles_and_administrators
    • First observedpetitions
    • First observedrooms_and_zones
    • First observedsite_history
    • First observedstockpiles
    • First observedstocks
    • First observedthreats
    • First observedtile_region
    • First observedtrade
    • First observedunmet_needs
    • First observedwiki_lookup
    • First observedwiki_search
    • First observedwork_details
    • First observedwork_order_list

TDQS

A4.2/5.0
Disambiguation4/5

Each tool targets a distinct subsystem (wiki, artifacts, burrows, etc.), and the extremely detailed descriptions make them individually clear. However, several tools overlap in reporting hostiles (threats, defenses, military) and terrain/water facts (environment, geology, fluids), so an agent could initially hesitate before picking the right one. The primary purposes differ enough that only minor confusion exists.

Naming Consistency4/5

All names use consistent lowercase snake_case and are mostly plural nouns or noun phrases (e.g., stockpiles, rooms_and_zones). A few are verb+noun (find_unit, wiki_lookup) or a bare verb (identify), which is a minor deviation but still follows the same casing style and remains readable. The pattern is predictable overall.

Tool Count2/5

At 37 tools, this server sits well above the 25-tool threshold the rubric marks as too many. While Dwarf Fortress is complex, several tools could be consolidated (e.g., threats/defenses/military, environment/geology/fluids), inflating the surface without a proportional increase in distinct capabilities. The count feels heavy rather than lean.

Completeness5/5

The tool surface offers comprehensive read-only coverage of the loaded fort: units, labor, military, health, supplies, structures, trade, and world data. Chaining is well-designed (find_unit -> citizen, wiki_search -> wiki_lookup) and there are no obvious dead ends. The only missing features are actuator tools, which are outside this server's stated read-only scope.

Maintenance

ActivitySlowing
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    A local-first MCP server that gives AI coding agents persistent memory and controlled commands. Features a git-backed markdown knowledge vault with FTS5 search, surgical section edits, token-aware context budgeting, and a sandboxed command engine with human approval gates. Works with Claude Code, Cursor, Copilot, Gemini, and more.
    53
    10
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that gives your AI assistant full awareness of your local dev environment — running processes, Docker containers, git state, open ports, log files, and more.
    0
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A production-ready MCP server that gives an LLM agent standalone-equivalent control over a Mineflayer Minecraft bot — movement, mining, crafting, inventory, combat, containers, chat, and much more — exposed as 110 strongly-typed tools across 23 groups, with full bot lifecycle management and dual (poll + push) event streaming.
    95
    2
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A local MCP server that gives AI agents structured access to a personal Obsidian knowledge vault, with semantic search, organization through Maps of Content, and git-backed history.
    -

Latest Blog Posts

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/alexanderolvera/dfhack-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server