hcl-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hcl-mcpAnalyze circadian lighting for my office using the EPW weather file"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
hcl-mcp — Human-Centric Lighting MCP Server
A literature-grounded human-centric-lighting (HCL) engine exposed as a local Model Context Protocol server. It computes CIE S 026 α-opic and circadian metrics, reconstructs a physical spectral sky from an EPW, drives the per-channel Radiance daylight/electric/glare pipeline, and estimates light-driven alertness — all callable from any MCP client in natural language.
The spectral and circadian methods implement published models directly: Bird & Riordan 1986
(SPECTRL2 clear sky), Nann & Riordan 1991 (SEDES1 cloud modifier), CIE S 026:2018 (α-opic action
spectra), Amundadottir 2016 (nvRD alertness), Inanici, Brennan & Clark 2015 (3-/9-channel).
Full citation map and grounding-status index: docs/literature-bibliography.md.
Version 0.1.0 · Python ≥ 3.11 · License MIT Optional engines Radiance 6.1a (daylight / electric / glare / native spectral) · Daysim (sub-hourly weather) · SMARTS (spectral oracle)
The pure-Python spectral core has zero runtime dependency on Radiance or Daysim — it always runs. The simulation layers follow a strict run-or-emit contract: if the binary is present they execute; if not, they return the exact command sequence they would have run.
Install in two lines
In Claude Code:
/plugin marketplace add akontadakis/hcl-mcp
/plugin install hcl-mcp@hcl-mcpRestart Claude Code and the 47 tools are live, together with the running-hcl-studies skill. You
need uv on your PATH; Radiance stays optional. Other hosts and
the manual route are under Installation.
Related MCP server: ladybug-tools-mcp
Key Features
🌈 Spectral foundation — SPD → 3-/9-channel bins; the full CIE S 026 α-opic suite (S/M/L-cone, rhodopic, melanopic E / ELR / EDI), photopic / melanopic / neuropic equivalent illuminance, CCT + Duv, mel-DER, EML.
🌌 Physical spectral sky from EPW — radiative transfer instead of CIE-D-series templates: a pure-Python Bird SPECTRL2 clear-sky engine plus the SEDES1 cloud bridge, driven by EPW-derived atmosphere (AOD / PWV / ozone) and solar geometry, resampled to 1 nm over 380–780 nm. The clear-sky engine is selectable (
engine="spectrl2"default |"smarts"), and Radiance 6.xgensdaymtxis exposed as its own native tool. Four atmospheric refinements are opt-in and every default reproduces the base physics byte-for-bit.☀️ Spectral daylight simulation — colored Perez sky/sun plus the per-channel Radiance pipeline: point-in-time grids, fisheye eye-level images, 2-phase annual Daylight-Coefficient (DDS) runs with circadian dosimetry, climate-based metrics (DA/cDA/UDI, sDA/ASE), CIE-overcast Daylight Factor, and LM-83-12 sDA/ASE with blinds actually operated.
💡 Electric lighting — IESNA LM-63 photometry,
ies2radconversion, EnergyPlus-faithful daylight-responsive controls and energy savings, glare via evalglare (UGR/DGP), and EN 12464-1 task interpretation.🧠 Circadian alertness — the nvRD non-visual direct-response model (Amundadottir 2016) with an automatic annual → alertness bridge driven by Daysim sub-hourly weather.
✅ Compliance — mel-EDI / EML verdicts against WELL v2 L03, Brown 2022, ISO/CIE 8995-1:2025 and EN 17037, plus EN 12464-1:2021 task lighting. Each verdict carries its threshold, citation and measurement convention.
📐 OBJ/CAD geometry import — a real Wavefront
.objroom becomes a per-channel Radiance scene with per-group spectral materials, true-north orientation, derived sensors (work-plane grid, seated and standing eye observers, DGP views), a ground↔sky albedo bridge, drop-in luminaires, and a provenance manifest. Unmapped groups hard-fail — no silent generic material.🧭 Guided studio journey —
hcl_studioruns a full study end to end (goal → fixture design viarecommend_fixtures→ simulate →build_report) with a resumable brief.🔬 Verifiable — a built-in
validate()self-test anchors constants against CIE S 026 published values, and every constant is documented against the source line it came from.
What It Computes
Domain | Quantities |
α-opic (CIE S 026) | Melanopic / S-/M-/L-cone / rhodopic irradiance (E_α), efficacy of luminous radiation (ELR), Equivalent Daylight Illuminance (EDI), D65-normalized |
Circadian | Photopic lux; mel-EDI and |
Color | CCT (Ohno 2013) + Duv |
Daylight | Point-in-time grid HCL metrics, fisheye FOV-weighted melanopic luminance, annual mel-EDI series, hours-above-threshold dosimetry, DA/cDA/UDI, sDA/ASE, CIE-overcast Daylight Factor, named sensor sets |
Spectral sky | EPW-hour atmospheric state (AOD, PWV, ozone, pressure, albedo), solar geometry, SPECTRL2 + SEDES1 cloud-modified 1 nm direct-normal and sky-diffuse irradiance (380–780 nm), spectral ground glow, annual sky artifacts (SPD set / band matrix / spectral |
Electric | Rated lumens / efficacy / LOR / beam & field angles, zonal flux, daylight-control power fraction, energy savings (kWh/m²·yr) |
Alertness | Relative non-visual direct response |
Fixture design | Lumen method reconciled with a CIE S 026 mel-DER solve: required flux, fixture count and spacing-to-height layout, target CCT band, power density, binding constraint (visual vs circadian) |
Compliance | Pass/fail verdicts with thresholds, citations, and measurement conventions |
Installation
→ Full manual for macOS / Windows / Linux across five clients: INSTALL.md. The summary below is the short version.
Requirements
Requirement | Version | Notes |
Python | ≥ 3.11 | from |
current | installs deps and launches the server | |
| ≥ 2.0 · ≥ 2 · ≥ 0.4.4 · ≥ 3.7 | installed automatically; all four are hard dependencies |
External engines are optional — see External Engines.
Claude Code — plugin (two lines)
This repository is also a Claude Code plugin marketplace, so one install registers the server and
the running-hcl-studies skill:
/plugin marketplace add akontadakis/hcl-mcp
/plugin install hcl-mcp@hcl-mcpRestart Claude Code and check with /mcp. The plugin launches
uvx --from git+https://github.com/akontadakis/hcl-mcp hcl-mcp and declares no environment
variables — the server inherits your shell's, so put HCL_RADIANCE_BIN / RAYPATH in your shell
profile, or use the CLI method below, which takes --env. Manage it later with /plugin.
Claude Code (CLI)
claude mcp add hcl-mcp -- uvx --from git+https://github.com/akontadakis/hcl-mcp hcl-mcpuvx fetches, builds and caches the server on first run. Add variables with --env (repeatable),
e.g. --env HCL_RADIANCE_BIN=/usr/local/radiance/bin. Use -s user to register globally.
Claude Desktop / other MCP clients
{
"mcpServers": {
"hcl-mcp": {
"command": "uvx",
"args": ["--from", "git+https://github.com/akontadakis/hcl-mcp", "hcl-mcp"],
"env": {
"HCL_WORK_ROOT": "/ABSOLUTE/PATH/TO/work", // optional: where sim files are written
"HCL_RADIANCE_BIN": "/usr/local/radiance/bin", // optional: Radiance bin dir if not on PATH
"HCL_DAYSIM_BIN": "/ABSOLUTE/PATH/TO/daysim/bin" // optional: Daysim bin dir
}
}
}
}Remove the
//comments — JSON does not allow them. VS Code usesservers(notmcpServers) and needs"type": "stdio"; seeINSTALL.md.
⚠️ Running from a local clone? Use
uv tool install .(the launch command is then justhcl-mcp), notuv run --directory ….uv run's implicit sync can leave the editable install in a state where the bare interpreter cannot import thesrc/-layout packages, and the server dies withModuleNotFoundError: hcl_core. SeeINSTALL.mdMethod B.
Development setup
uv sync --extra dev # runtime + pytest
uv run pytest -q # full test suiteThe run/emit contract
Every tool that touches Radiance or Daysim takes run: bool = True and behaves identically:
run=Trueand the binary is available → it executes and returns results.run=False, or the binary is missing → it does not execute and returns{"ran": false, "commands": [ ...exact ordered shell lines... ], "reason": ...}.
So you can design and inspect a full pipeline — sky generation, octree compilation, ray tracing,
matrix multiplication — on any machine, then run the identical commands where an engine exists.
Call validate(), radiance_status() and daysim_status() first to see which layers will execute.
Capabilities
47 tools · 14 resources · 13 prompts. The server registers 51 tool names: the 47 plus four
verb-object aliases (get_reference, list_presets, import_weather, run_validation) for
clearer AI tool selection.
Group | Runs | Tools |
🌈 Spectral core | always (pure Python) |
|
☀️ Daylight simulation | run-or-emit |
|
📐 Geometry & sensors | mixed |
|
🌌 Physical spectral sky | pure Python ( |
|
💡 Electric lighting | mixed |
|
🧠 Circadian alertness | pure Python |
|
🗓️ Daysim | run-or-emit |
|
🧭 Studio journey | always |
|
→ Every tool with its full signature, semantics and honesty notes: docs/operating-guide.md §4. Resources and prompts: §5.
Two things worth knowing before you read any result:
quality_presetsmakes the ambient-accuracy/runtime trade-off explicit rather than inherited.low(-ab 0) has no interreflection, so DA/sDA/UDI are meaningless there while ASE stays exact;high(-ab 3) is the floor for anything reportable. On one validated annual run the preview-grade default returned sDA 77.78% where a converged solve returned 100.00% on identical geometry — hence theconvergence_warningthatannual_daylightnow attaches.Advisories. Any tool returning a dict may carry an
advisorieslist — absent entirely when there is nothing to flag. Each entry is{code, severity, message, field?}with severityerror(result probably unusable),warn(usable but easy to misreport) orinfo(a default was applied). They are reporting, not physics: each rule re-reads a field the tool already computed. The nine codes areMEL_DER_BINNED,SPECTRAL_TRANSPORT_SHIFT,ELECTRIC_EXCEEDS_LUMEN_BOUND,ALBEDO_NOT_MEASURED,DOSE_THRESHOLD_IS_DEFAULT,ZONE_WEIGHT_REMAINDER,GEOMETRY_HEALTH_UNCLEAN,NVRD_ZERO_DIVERGENCEandRADIANCE_DROPS_IES_CANDELA_SCALE; each is defined indocs/operating-guide.mdanddocs/technical-reference.md, and ADR-0005 explains why they attach at the registration seam. Known v1 gap: advisories attach only to dict results, so multi-pointcircadian_metrics(which returns a list) carries none — checkmel_der_sourceper point by hand there.
Usage Examples
These show the underlying tool calls. In an MCP client you just ask in natural language ("What's the melanopic EDI of D65 and does it pass WELL v2?") and the model picks the tools.
channel_type: 0 = 3-channel, 1 = 9-channel.spdaccepts a.spdfile path, SPD text, or(wavelength, value)rows.
1 · SPD → circadian metrics + compliance (pure Python — no engine needed)
{ "tool": "presets", "arguments": { "name": "D65" } }
{ "tool": "spd_to_channels", "arguments": { "spd": "<SPD data from step 1>", "channel_type": 1 } }
{ "tool": "alpha_opic", "arguments": { "channels": [0.10,0.12,0.20,0.30,0.35,0.33,0.25,0.18,0.12], "channel_type": 1 } }
{ "tool": "compliance", "arguments": { "mel_edi": 250, "standard": "well_v2_l03" } }2 · Annual climate-based daylight metrics (reuse one named sensor set across the daylight tools)
{ "tool": "sensors", "arguments": {
"action": "create", "name": "wp",
"grid": { "interior": [0.25, 5.75, 0.25, 3.75], "floor_z": 0.0, "workplane_h": 0.8 } } }
{ "tool": "annual_daylight", "arguments": {
"channel_scenes": [{ "materials": "materials.rad", "geometry": "room.rad", "sky_color": [0.9, 0.95, 1.0] }],
"wea": "athens.wea", "sensor_set": "wp", "channel_type": 0,
"da_threshold": 300, "sda_da_fraction": 0.5, "ase_threshold": 1000, "ase_hours": 250, "run": true } }
{ "tool": "daylight_factor", "arguments": {
"scene_sets": ["materials.rad", "room.rad"], "sensor_set": "wp", "run": true } }
annual_daylightreturns per-point DA/cDA/UDI plus spatial sDA/ASE (ASE via its own direct-only-ab 0pass — the two lux matrices are not interchangeable);daylight_factoradds the CIE-overcast DF %.
3 · Guided studio journey — design the fixtures, then grade the result (the front door)
Say "design human-centric lighting for a 6×4×3 m office targeting WELL mel-EDI 250 and run a
study." The hcl_studio prompt conducts all 8 phases; the design and reporting steps are pure
Python and always run.
{ "tool": "recommend_fixtures", "arguments": {
"length_m": 6, "width_m": 4, "height_m": 3, "mount_height_m": 2.8,
"target_em_lux": 500, "target_mel_edi": 250 } }
{ "tool": "build_report", "arguments": { "study": "office_a", "brief": "<accumulated brief>" } }→ Colored sky + grid, annual circadian dose, electric design + glare, and the full studio walkthrough: docs/operating-guide.md §3.
Architecture
Five modules in four layers. Imports point downward only, so knowing which layer a tool lives in tells you what it needs to run.
┌──────────────────────────────────────────────────────────────────────────┐
│ hcl_mcp/ Thin FastMCP server — 47 tools, 14 resources, 13 prompts. │ ← pure protocol
│ Maps tools onto the modules below; no business logic. │
├─────────────────────────────────┬────────────────────────────────────────┤
│ hcl_radiance/ │ hcl_daysim/ │ ← ONE layer, two peers
│ Radiance adapter: detect │ Daysim adapter (ds_shortterm / │ (not stacked)
│ binaries → build commands → │ epw2wea). Sub-hourly weather for │ each needs its own
│ run-or-emit → parse. Native │ the alertness bridge. │ engine; Daysim is
│ gensdaymtx · OBJ import. │ Build-from-source. │ build-from-source
│ └───── annual nvRD borrows the .wea generator ─────┘ │ ← the one lateral edge
├─────────────────────────────────┴────────────────────────────────────────┤
│ hcl_core/ Pure-Python spectral math (≤401-pt arrays, plain loops). │ ← always runs,
│ CIE S 026 α-opic, channels, circadian metrics, │ zero engine deps
│ compliance, nvRD model, spectral reconstruction, and the │
│ physical EPW→spectral-sky pipeline (SPECTRL2 + SEDES1). │
├──────────────────────────────────────────────────────────────────────────┤
│ hcl_platform/ Cross-platform path, text-I/O and executable resolution. │ ← stdlib only
└──────────────────────────────────────────────────────────────────────────┘The separation is enforced, not conventional: tests/test_module_layering.py walks src/ and
fails the suite on any import above a module's layer. hcl_core has zero dependency on the
Radiance/Daysim binaries — the property that makes the spectral core portable. The one caveat is
the optional SMARTS oracle (hcl_core/spectral_engine/smarts.py), the single core path that
shells out, capability-gated on $SMARTSPATH. All Radiance/Daysim subprocess transport lives in
hcl_radiance / hcl_daysim; the MCP layer holds no business logic.
Dataflow
Every tool is a node in one of six pipelines. All inputs reduce to a small set of canonical artifacts — an SPD, a channel vector, a Radiance scene, an EPW, an IES luminaire — and the pipelines converge on circadian metrics, a compliance verdict, or a report.
A · SPECTRAL CORE (hcl_core — pure Python, always runs)
SPD ─┬─ spd_to_channels ─► channels[3|9] ─┬─ alpha_opic ───────► α-opic E/ELR/EDI, mel-EDI ─┐
preset┘ (or exact SPD ─────────────────► )├─ circadian_metrics ► photopic/melanopic lux, EML ├─► compliance
└─ spectral_metrics ─► CCT/Duv, mel-DER, EML↔EDI ┘ └─► PASS/FAIL + citations
B · DAYLIGHT SIMULATION (hcl_radiance — run-or-emit)
channels ─► colored_sky ─► sky.rad ─┐
scene (.rad materials + geometry) ──┼─► run_grid ─► oconv → rtrace -I ×channel ─► grid HCL metrics
├─► run_image ─► rpict ×channel ───────────► melanopic luminance maps
weather (.wea) ─────────────────────┴─► run_annual ─► 2-phase DDS ─────────────► annual mel-EDI ─► dosimetry
C · PHYSICAL SPECTRAL SKY (hcl_core; native variant run-or-emit)
EPW + (m,d,h) ─► atmosphere + solar geometry ─► SPECTRL2 + SEDES1 ─► SpectralSkyRecord
─► channels · reconstruction · emitters · α-opic
D · ELECTRIC LIGHTING (hcl_core analysis + hcl_radiance render)
IES (LM-63) ─┬─ ies_analyze ──────────────────────► photometric report
└─ ies_to_radiance ─► colored_luminaire ─┐
scene + sky ──────────────────────────────────────────┴─► glare_ugr ─► UGR/DGP + glare sources
illuminance @ points ─► lighting_controls ─► daylight_savings ──────► savings (kWh/m²·yr)
E · CIRCADIAN ALERTNESS (hcl_daysim sub-hourly → hcl_core nvRD)
EPW ─► generate_subhourly_wea ─► .wea ─► annual_nvrd ─┬─ reconstruct_spectrum ─► per-nm SPD
└─ nvrd ─► R_D(t) + cumulative dose
F · GUIDED STUDIO JOURNEY (hcl_studio prompt orchestrates)
goal ─► recommend_fixtures ─► save_brief ─► [run B / D sims] ─► build_report ─► report.{md,html}Three properties hold across all six: the core path always runs; the simulation paths
run-or-emit; and physics is computed once, then consumed — the SpectralSkyRecord is frozen
sky-truth and nothing downstream recomputes it.
→ Pipeline C stage by stage, with boundary data structures and per-symbol source map: docs/spectral-sky-methodology.md §3 and docs/spectral-sky-as-built.md.
Project Structure
hcl-mcp/
├── src/
│ ├── hcl_core/ # Pure-Python spectral math (the verifiable asset)
│ │ # α-opic integrals · action spectra · SPD binning · CCT/Duv
│ │ # compliance · nvRD · spectral reconstruction · daylight metrics
│ │ # LM-83 + Klems · IES · lighting controls · fixture design
│ │ # EPW → atmosphere/solar geometry → SPECTRL2 + SEDES1 → sky record
│ │ └── spectral_engine/ # pluggable clear-sky engines: spectrl2 (pure Python) · smarts (gated)
│ ├── hcl_radiance/ # Radiance adapter: detect → build commands → run-or-emit → parse
│ │ # grid · image · annual DDS · three-phase LM-83 · OBJ import
│ │ # sensors · glare · native gensdaymtx
│ ├── hcl_daysim/ # Daysim adapter: epw2wea, ds_shortterm, build-from-source
│ ├── hcl_mcp/ # FastMCP server: tools, resources, prompts, advisories, studio
│ └── hcl_platform/ # Cross-platform paths, text I/O, executable resolution (stdlib only)
├── tests/ # Unit + layering + capability-gated live tests
├── hcl_validation/ # End-to-end validation kit driven through real chat tool-calls
├── docs/ # Methodology, technical reference, ADRs, engine build guides
├── skills/ # running-hcl-studies (auto-loaded by the Claude Code plugin)
├── .claude-plugin/ # Plugin marketplace + plugin manifest
└── .mcp.json # Server declaration used by the pluginhcl_validation/ is the complement to tests/: tests/ verifies the Python
math in isolation, the kit exercises the whole MCP surface the way a user drives it — every tool
called live, every resource read, every prompt rendered. Start at its
README.md, then GUIDE.md and
TEST-PLAN.md.
Configuration
All environment variables are optional.
Variable | Purpose | Default |
| Directory where simulation files are written | first MCP client root, else |
| Radiance | auto-discovered on |
| Daysim | auto-discovered on |
| SMARTS executable — the file, not its directory | unset (SMARTS engine unavailable) |
| Only for a local clone launched from source — set to the | — |
work_dir precedence: explicit tool argument → HCL_WORK_ROOT → first MCP client root → ~/hcl_work.
External Engines
Layer | Needs | Notes |
Spectral core | nothing | Pure Python — always runs. |
Daylight / electric / glare + native spectral | Radiance 6.1a | One build is a superset of the old |
Sub-hourly weather |
| |
Spectral oracle | SMARTS 2.9.5 | Optional; only for |
→ Get-source → build → set-env → verify checklist for all three: docs/engines-install.md.
Troubleshooting
Symptom | Cause & fix |
Server won't start / | The |
A simulation tool returns | Working as designed — the engine isn't found, so the tool emits its command plan. Run |
|
|
| EN 12464-1 is judged on task parameters, not a |
A relative file path fails oddly | Every file-shaped argument resolves against the server's working directory, not your shell's. Pass absolute paths — a bad relative path can surface as a parse error rather than "missing". |
Files written somewhere unexpected | Output goes to |
Validation & Accuracy Caveats
This toolkit is honest about what is proven versus what is latent. Read this before trusting a
live run. Canonical wording lives in docs/spectral-sky-as-built.md §9
and docs/technical-reference.md §12–13.
Verified
✅ The spectral math.
validate()anchorsK_D65against CIE S 026 published values (within 0.05%), checks weight-sum and scale-invariance properties, and confirms mel-DER(D65) ≈ 1.0. Two deliberate fixes over the Lark source are applied (Python-2 integer division; a 3-channel bin-ordering misalignment).✅ The grid daylight pipeline. A unit-radiance hemisphere reproduces
562.345 lux = 179 × πon both the 3- and 9-channel paths under live Radiance.✅ OBJ geometry import — live-checked on Radiance 6.1a: the
obj2rad → xform → oconv → rtraceround-trip, a north-rotation round-trip, an IES-luminaire octree build, and the colored-by-materialannotaterender.✅ The offline spectral stack. EPW → atmosphere/solar geometry → SPECTRL2 → SEDES1 →
SpectralSkyRecord→ artifacts is unit-tested end to end; the SPECTRL2 constants are transcribed verbatim from the NRELspectrl2_2.csource.
First live runs, not calibrated baselines
⚠️
gensdaymtxand SMARTS. SMARTS agrees with the Python SPECTRL2 engine to ~2% direct / ~7% diffuse, r≈0.99 (docs/spectral-engine-comparison.md). Neither is validated against measured sky spectra.⚠️ The
physical_skyflip. First live execution 2026-07-18 measured 50.03% physical coverage — daylight timesteps carry EPW-derived spectra, night timesteps fall back to the template by design — with a time-resolved sun throughout.⚠️
annual_daylight/daylight_factor/daylight_savings/sensors. All ran live on a realistic office plus Athens IWEC. Two identical preview-grade runs gave sDA 66.7% and 82.2% — Radiance's ambient calculation is stochastic, so preview-grade sDA is not reproducible. ASE was bit-identical across runs, since its direct-only pass has no ambient sampling. Usequality="high"for anything you intend to quote.⚠️ The electric path. First end-to-end live run 2026-07-18. It exposed a Radiance build defect, not an hcl-mcp one: a custom 6.1a build's compiled
source_corrdropped theies2radA1candela-scale multiplier, so IES luminaires under-emitted ~14×, which also collapsed UGR to 0. Patchingsource.calgave a realistic 494 lux average and UGR 19.24 / DGP 0.199. Do not foldA1intocolored_luminaire— that double-scales on a stock Radiance. Sky paths are unaffected.
Known limits
⚠️
R_D(alertness) is relative only. The nvRD intensity response was fit from nighttime electric-light studies; daytime adaptation is unvalidated, and an unexplained channel→irradiance constant biases the absolute value (it cancels in ELR/EDI ratios but not in the nonlinear sigmoid).⚠️ The SEDES1 cloud CCM carries real spectral-shape uncertainty. Only the always-on energy rescale is exact. Per-wavelength regression uncertainty is surfaced as
ccm_sigma; the CCM can be locally re-fit (docs/recalibrating-cloud-ccm.md). The opt-in SEDES2 tabulated alternative closes the digitization caveat but remains a German-site fit, and its independent variable is NGH, notKt— it is not a drop-in.⚠️ Spectral physics is opt-in. Without
physical_sky=Truethe enhanced reconstruction uses the reference-sky template with an air-mass-colored sun. The seam is wired, not on by default.⚠️
lm83_method_conformantis always false by design. §§2.2.8–2.2.11 are out of scope, so glazing runs at rawtvis, biasing sDA up. Readconditions.departuresbefore quoting.⚠️ The OBJ carries no spectral data. Reflectances are user-assigned;
.mtlis a hint. The measured-SPD path exists, but the shipped catalog is illustrative scalars pending data.📐 Accuracy envelope (Lark, Pierson 2023): daylight mel-EDI within ±20%, validated for neutral-colored interiors — chromatic or strongly inter-reflecting scenes degrade. 3-channel is an approximation; 9-channel is recommended, and the exact-from-SPD α-opic path is provided for validation.
Documentation
Document | What it covers |
Step-by-step install for macOS / Windows / Linux across five MCP clients | |
Running an end-to-end study: workflows (§3), every tool (§4), resources and prompts (§5), prerequisites (§6) | |
Full methodology, mathematics, per-module source map, consolidated correctness findings (§12) | |
The HCL method itself, independent of this implementation | |
EPW→spectral-sky as-built: stage map, deviations ledger, canonical caveats (§9) | |
Spectral-sky physics, equations, per-symbol source map | |
Live three-way engine comparison: SPECTRL2 vs SMARTS vs | |
Re-fitting the SEDES1 cloud CCM from your own measured diffuse spectra | |
Building and verifying Radiance, Daysim and SMARTS | |
Full citation map and grounding-status index | |
Architecture decision records — why the contentious choices are what they are |
References & License
The load-bearing authorities. The complete map, with grounding status per claim, is in
docs/literature-bibliography.md.
Quantity / method | Authority |
α-opic EDI/ELR, action spectra, K_D65 | CIE S 026/E:2018 |
3-/9-channel spectral method, EML | Inanici, Brennan & Clark 2015; Lark Spectral Lighting v3.0 |
Neuropic / OPN5 (9-channel) | Jung, Cheng, Brennan & Inanici 2023; Kojima 2011 |
CCT / Duv | Ohno 2013; CIE 1931 2° observer |
ipRGC FOV weighting | Khademagha 2021 (TU/e) |
nvRD alerting model | Amundadottir 2016 (EPFL) |
2-phase Daylight Coefficient with Direct Sun (DDS) | Subramaniam 2017 |
Clear-sky spectral model (SPECTRL2) | Bird & Riordan 1986, J. Climate Appl. Meteorol. 25:87 |
Cloud spectral modifier (SEDES1) | Nann & Riordan 1991, J. Appl. Meteorol. 30:447 |
Relative optical air mass | Kasten & Young 1989, Appl. Opt. 28:4735 |
Precipitable water | Gueymard 1994; Reitan 1963 |
Accuracy envelope (±20%) | Pierson, Aarts & Andersen 2023, J. Build. Perf. Sim. 16(2):179–197 |
Neutral-sun bias; sky/sun spectra | Inanici, Abboushi & Safranek 2023, Light. Res. Technol. 55:502–529 |
Lighting controls | EnergyPlus Engineering Reference v25.2 |
IES photometry format | IESNA LM-63-1995 / 2002 |
Compliance standards | WELL v2 L03; Brown et al. 2022, PLoS Biol. 20:e3001571; ISO/CIE 8995-1:2025; EN 17037:2018; EN 12464-1:2021 |
Acknowledgements & License
hcl-mcp is released under the MIT License — © 2026.
It is an independent implementation grounded in primary scientific literature that derives certain spectral algorithms from Lark Spectral Lighting (Mehlika Inanici et al., University of Washington; ZGF Architects LLP; EPFL; Oregon State University; Eindhoven University of Technology) — a prior implementation of the same science — and invokes the Radiance (LBNL) and Daysim (NRC / Fraunhofer ISE) engines as external subprocesses. It bundles no Lark, Radiance, or Daysim binaries.
The Lark algorithms are distributed under a Modified 3-Clause BSD License; its copyright notice
is retained, and this product is named hcl-mcp (not "Lark") in compliance with that license.
Radiance, Daysim and all Python dependencies (fastmcp — Apache-2.0; mcp, pydantic — MIT;
colour-science — BSD-3-Clause) retain their own licenses.
→ Full attributions and license texts: THIRD-PARTY-NOTICES.md.
Available Tools
51 toolsalpha_opicA
CIE S 026 alpha-opic E/ELR/EDI. Provide spd (exact-spectrum route) OR channels (binned route).
spd accepts a .spd file path, 2-column text, or a list of [wavelength, value].
alpha: 1=S,2=M,3=L,4=rhodopic,5=melanopic; omit for all five.
For the spd path, a scale_warning key is attached (CORE-3): non-None when the SPD looks
RELATIVE/normalized (peak <= 1.5) and the E/EDI values are shape indicators rather than
lux-scale, else None. The channel path is unaffected.
| Name | Required | Description | Default |
|---|---|---|---|
| spd | No | ||
| alpha | No | ||
| channels | No | ||
| channel_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It discloses the scale_warning behavior, the relative/normalized threshold (peak <= 1.5), and that the channel route is unaffected. This is meaningful behavioral detail beyond the schema, though it stops short of explaining error cases or exact output behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized and dense without being bloated. The inputs are front-loaded, the alpha mapping is compact, and the scale_warning note is placed at the end where it belongs. Slight cryptic reference to 'CORE-3' costs some clarity, but overall every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has four parameters, no annotations, and no parameter descriptions in the schema, so the description carries a heavy load. It covers the spd route well, including supported input forms and alpha options, but leaves the channels route and channel_type semantics under-specified. The mutual exclusivity of spd vs channels is implied but not explicitly enforced, which could confuse an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does explain spd formats, alpha values, and the general channel route, which adds real meaning to the opaque schema. However, channel_type is not described at all, and the channel array contents are only vaguely called 'binned route'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly identifies the tool as computing CIE S 026 alpha-opic E/ELR/EDI values and distinguishes the two input routes (spd vs channels). It is not merely a restatement of the name, and the alpha mapping adds specificity. However, it does not explicitly differentiate this from nearby siblings like circadian_metrics or spectral_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives important usage constraints: provide spd OR channels, alpha values are mapped 1-5, and omitting alpha returns all five. It implies when to use the exact-spectrum vs binned route, but it does not state when to choose this tool over alternatives or provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
annual_daylightB
Annual climate-based daylight metrics on the grid: per-point DA/cDA/UDI + spatial sDA/ASE.
channel_scenes: 1 dict (3ch) or 3 dicts (9ch), each {materials:[paths], geometry:path, sky_color:[r,g,b]} -- same shape as run_annual. points: inline rows or a .pts path; OR pass sensor_set='name' (created via the sensors tool). ASE uses a dedicated direct-only (-ab 0) pass. occupancy: optional per-timestep 0/1 mask (defaults to weekday occupied_start..end, Monday-anchored 8760-h). Runs Radiance if present, else returns the command sequence.
shading_model: declare the scene's operable shading -- 'none' (no device modelled),
'modelled' (a device is in the geometry) or 'lm83_default_blind'. The returned sDA_basis
block records it alongside the analysis period and says whether the sDA key is an LM-83
sDA or only the underlying DA-based spatial fraction. Left undeclared it reports
'undeclared' and lm83_conformant: false -- the metric is never assumed conformant.
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| wea | Yes | ||
| points | No | ||
| quality | No | ||
| udi_aut | No | ||
| udi_sup | No | ||
| work_dir | No | ||
| ase_hours | No | ||
| occupancy | No | ||
| udi_lower | No | ||
| rad_params | No | ||
| sensor_set | No | ||
| channel_type | No | ||
| da_threshold | No | ||
| occupied_end | No | ||
| timestep_min | No | ||
| ase_threshold | No | ||
| shading_model | No | ||
| channel_scenes | Yes | ||
| occupied_start | No | ||
| sda_da_fraction | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 reveals that it 'Runs Radiance if present, else returns the command sequence,' explains the ASE direct-only pass, and details the shading_model handling including the 'undeclared' fallback and lm83_conformant flag. This is substantive transparency about operational behavior, though it omits potential side effects or file modifications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured. It leads with the core purpose, then explains parameters in a logical order, front-loading the critical input shapes. While it is lengthy, every sentence adds substantive information. It could be tightened, but it is not redundant or wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 21 parameters, no annotations, and a complex domain, the description covers the most conceptually difficult inputs and behaviors but leaves gaps. It does not describe the output schema (though an output schema exists), nor does it explain many parameter defaults and their implications. The description is adequate for a user already familiar with the domain but not fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the most complex parameters (channel_scenes, points, sensor_set, occupancy, shading_model) with detailed syntax and defaults. However, it leaves many other parameters (e.g., run, wea, quality, udi_aut, udi_sup, thresholds, timestep_min) unexplained, and the schema itself provides no descriptions. The explanation is helpful but incomplete for the full parameter set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Annual climate-based daylight metrics on the grid: per-point DA/cDA/UDI + spatial sDA/ASE.' It uses specific metric names and indicates the resource (grid). However, it does not explicitly differentiate from close siblings like run_annual or lm83_daylight beyond a passing reference to 'same shape as run_annual,' so it falls short of full clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to choose this tool over alternatives. It references run_annual's shape and the sensors tool for sensor_set, but does not state conditions like 'use this instead of run_annual when you need spatial sDA/ASE' or mention exclusions. The usage context is implied by the metric names but not articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
annual_nvrdA
Annual light-driven alertness (nvRD R_D) straight from weather (spec §5.1). LONG-RUNNING.
EPW -> Daysim sub-hourly .wea -> colored 2-phase DDS (sky & sun separate) -> per-timestep dual
reconstruction (faithful flat + neutral sun; enhanced reference sky + air-mass colored sun) ->
nvRD twice -> {faithful:{R_D,RD_cum}, enhanced:{R_D,RD_cum}, divergence, RD_series_divergence}.
R_D is RELATIVE only. SINGLE reference point+view per run. reconstruction={both|faithful|enhanced}
(default both). timestep_min default 6 (0.1 h). run=False emits the full Daysim+Radiance command plan
— but channel_scenes and points are required for BOTH the live and emit paths (the plan is built
from the actual per-channel scene transport, not from point_xyz/view_vec alone).
points: inline [x,y,z,dx,dy,dz] rows OR a .pts path (a list is materialized to a .pts under work_dir,
same contract as run_annual).
physical_sky (opt-in): shape the enhanced reconstruction with the physical EPW-derived per-timestep sky/sun spectra instead of templates; default off.
engine: spectrl2 (default) | smarts (requires SMARTSPATH); only used when physical_sky=True.
Site location is read from the EPW itself (converted to DAYSIM convention by the Daysim adapter); the tool takes no caller-supplied coordinates, so wrong-convention coordinates cannot silently corrupt the solar geometry.
| Name | Required | Description | Default |
|---|---|---|---|
| epw | No | ||
| run | No | ||
| engine | No | spectrl2 | |
| points | No | ||
| quality | No | ||
| sky_cct | No | ||
| view_vec | Yes | ||
| work_dir | No | ||
| point_xyz | Yes | ||
| rad_params | No | ||
| channel_type | No | ||
| physical_sky | No | ||
| sun_spectral | No | colored | |
| timestep_min | No | ||
| channel_scenes | No | ||
| reconstruction | No | both | |
| sky_reconstruction | No | reference |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses multiple behavioral traits: the pipeline is 'LONG-RUNNING', R_D is 'RELATIVE only', the tool reads site location from the EPW itself to prevent coordinate convention errors, and it explains the difference between live and emit paths (including required parameters for both). It also details the engine dependency on SMARTSPATH when physical_sky=True, and the default behavior of reconstruction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense block of text but every sentence carries technical value. It front-loads the core purpose and then systematically covers the pipeline, outputs, and parameter semantics. It could be broken into bullet points for easier parsing, but it is not redundant or padded. Given the tool's complexity (17 parameters), the length is justified, though slightly intimidating.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 17 parameters and a detailed output schema, the description covers all essential aspects: the full computation chain, output structure (faithful/enhanced R_D and RD_cum, divergence), parameter behaviors, prerequisites (points and channel_scenes), and safety note about coordinates. The output schema exists, so return values are presumably documented there, and the description even outlines them. Nothing critical is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully. It does: it explains reconstruction values, timestep_min default and resolution, the points parameter format (inline or .pts path), the physical_sky opt-in and its engine requirement, the run flag's behavior, and the channel_scenes requirement. This adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear statement of purpose: 'Annual light-driven alertness (nvRD R_D) straight from weather (spec §5.1)'. It then details the exact pipeline and output structure, distinguishing it from generic annual simulation tools. The mention of 'SINGLE reference point+view per run' and the reconstruction options further specify scope, making it clear what this tool does and what it does not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides constraints (e.g., 'SINGLE reference point+view per run', 'run=False emits the full Daysim+Radiance command plan') but does not explicitly state when to use this tool over siblings like run_annual or nvrd. It implies usage through the detailed pipeline but lacks explicit exclusions or alternative routing, so guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
atmosphere_from_epwB
Derived atmospheric state (AOD, PWV, ozone, pressure, albedo, aerosol_g + provenance).
Opt-in refinements (defaults reproduce prior output): ozone_mode='climatology' computes ozone from the EPW LOCATION lat/lon + date (van Heuklon 1979); aerosol_g overrides the 0.65 asymmetry; aod_anchor_nm converts a declared-wavelength AOD (e.g. 550) to tau500 via the Angstrom exponent.
| Name | Required | Description | Default |
|---|---|---|---|
| day | Yes | ||
| epw | Yes | ||
| hour | Yes | ||
| month | Yes | ||
| aerosol_g | No | ||
| ozone_mode | No | ||
| aod_anchor_nm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does substantial work: it discloses the backwards-compatibility default ('defaults reproduce prior output'), names the exact model (van Heuklon 1979) and inputs (lat/lon + date) for ozone_mode, states the default 0.65 asymmetry that aerosol_g overrides, and explains the Angstrom-exponent wavelength conversion in aod_anchor_nm. It leaves 'provenance' and any error/validation behavior unexplained, but the core computational behavior is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences that earn their place, with the core output list front-loaded ahead of the refinements. The 'Opt-in refinements (defaults reproduce prior output):' header efficiently groups the three tuning parameters. Only minor redundancy exists in restating the default 0.65 within aerosol_g's clause, so no meaningful waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value format need not be explained. Yet the description misses several things an agent needs: the epw input format, the semantics of the required date/time parameters, the meaning of 'provenance' in the output, and any usage-vs-sibling routing. The algorithmic core is solidly covered, but for a 7-parameter scientific tool with zero annotations these gaps keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clearly explains the three optional refinements (ozone_mode, aerosol_g, aod_anchor_nm) with their exact effects. However, it says nothing about the four required parameters—especially epw, whose format (path vs. inline content) is genuinely ambiguous—nor about month/day/hour semantics such as timezone or year context. Covering 3 of 7 parameters at zero schema coverage is partial compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear derived product ('Derived atmospheric state (AOD, PWV, ozone, pressure, albedo, aerosol_g + provenance)') with an explicit output list and a derivation-from-EPW relationship. It distinguishes itself from siblings like spectral_epw by focusing on atmospheric-state quantities rather than spectral conversion, though it never names a sibling directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as spectral_sky_from_epw, spectral_epw, or weather. The description explains internal refinements but never states a triggering condition, prerequisite (e.g., valid EPW format), or exclusion such as 'for sky radiance use spectral_sky_from_epw instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_daysimA
Build Daysim (ds_shortterm + epw2wea) from source: clone master + headless arm64 CMake.
run=True executes if git+cmake are present; otherwise returns the ordered command plan + a reason. On success, bin_dir is the build/bin directory — set it as HCL_DAYSIM_BIN. Daysim is NOT bundled (NRC/Fraunhofer ISE source-available EULA); this clones+builds on your machine.
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| src_dir | No | ||
| work_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses cloning, building, the fallback when git/cmake are missing, the success output (bin_dir), and the licensing reason for not bundling. It also clarifies that it does not set the environment variable but instructs the user to do so.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no fluff, front-loading the purpose and method, then explaining behavior and licensing. Every sentence adds value and the structure is logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex and has an output schema, but the description covers the key outcome (bin_dir) and licensing. However, it omits parameter explanations and usage guidance, making it incomplete for an agent to decide when to use it and how to pass parameters effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It only addresses 'run' (executes if true and git+cmake present), leaving 'src_dir' and 'work_dir' completely unexplained. This is a significant gap for an agent to use the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Build' with the specific resource 'Daysim (ds_shortterm + epw2wea)' and the method 'clone master + headless arm64 CMake'. It distinguishes itself from siblings like daysim_status and build_report by being specifically about building Daysim from source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains behavior (run=True executes if git+cmake present, otherwise returns command plan) but does not explicitly state when to use this tool versus alternatives like daysim_status. It implies usage when Daysim is not present ('Daysim is NOT bundled') but lacks explicit guidance on alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_reportC
Render a study brief to //report.{md,html}: goal recap, fixture spec, target-vs-achieved table with pass/fail, circadian↔glare cross-check, compliance. Always runs.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | ||
| study | Yes | ||
| work_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits itself. It mentions 'Always runs' but does not explain file overwrite behavior, permission requirements, failure modes, or side effects on other data. The report generation might create or overwrite files, but this is not disclosed. The description is too vague to set accurate agent expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the primary action and output path immediately. It is concise and avoids filler. However, it may be too terse given the complexity of the tool and its parameters, but it earns a 4 for efficiency and structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a free-form brief object, multiple report sections, output file generation) and the absence of annotations, schema descriptions, and an output schema visible here, the description is incomplete. It does not cover the brief's schema, return value, error handling, or prerequisites, leaving an agent under-informed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters. It references <work_dir> and <study> in the path template, giving some meaning, but does not explain the 'brief' object structure or its required fields. The default for work_dir is null per the schema, but the description does not clarify how that is handled. Minimal semantic value added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renders a study brief into a report file with a specified path and enumerates the report's contents (goal recap, fixture spec, target-vs-achieved table, cross-check, compliance). This is specific and distinguishes it from siblings like save_brief or load_brief, which handle brief persistence rather than report generation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. The phrase 'Always runs' is ambiguous—it might imply no prerequisites or unconditional execution, but it does not clarify selection criteria or when not to use it. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_geometryA
Health-check an OBJ scene without building it (spec 2026-07-23).
Reports geometry defects that would otherwise complete silently and return a plausible
number: coplanar surfaces (Radiance z-fighting), glazing with no opening cut in the
wall, duplicated and non-planar faces, an unclosed enclosure. Every error and warning
carries a fix. Categories not yet implemented appear in skipped, so an absent
category never reads as clean.
Needs no Radiance binaries and builds no scene, so it is cheap to re-run while fixing a model. import_geometry embeds the same report as result["health"].
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | ||
| sensors | No | ||
| sidecar | No | ||
| up_axis | No | ||
| obj_path | Yes | ||
| material_map | No | ||
| photosensors | No | ||
| electric_lights | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 that it does not build the scene, requires no binaries, reports defects with a 'fix', and includes a 'skipped' category for unimplemented checks. It does not explicitly state that it is read-only or non-destructive, but the nature of a health-check implies this, and the mentioned behaviors are useful beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and efficiently structured. It front-loads the core purpose and spec date, then lists concrete defect types, then notes the 'skipped' behavior and the cheap-to-run advantage. Every sentence adds distinct value, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description thoroughly covers the tool's purpose and behavior, and since an output schema exists, it need not detail return values. However, with 8 parameters and zero schema coverage, the description does not compensate for the missing parameter documentation. An agent would not know what 'sensors', 'material_map', or 'sidecar' control, which is a notable gap for a tool with this many optional inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the input schema provides no property descriptions. The description adds essentially no information about the 8 parameters; only 'obj_path' is implied via 'an OBJ scene'. The optional parameters (units, sensors, sidecar, up_axis, material_map, photosensors, electric_lights) are completely unexplained, leaving an agent to guess their purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Health-check') and resource ('an OBJ scene'), and clarifies it operates 'without building it', distinguishing it from tools like import_geometry that build scenes. It also enumerates the specific defect categories it catches, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use it: it 'needs no Radiance binaries and builds no scene, so it is cheap to re-run while fixing a model.' It also points to an alternative by noting 'import_geometry embeds the same report as result["health"]'. However, it does not explicitly mention sibling tools like 'validate' or state when to prefer one over the other, so guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
circadian_metricsA
Photopic / melanopic / neuropic equivalent illuminance from channel irradiances.
Returns one metrics dict for a single point, or a list of dicts for many points. Each carries
BOTH melanopic_lux (a melanopic-weighted illuminance) and mel_edi (CIE S 026 melanopic
equivalent daylight illuminance) — they are different quantities, and the circadian standards
are written in mel-EDI, so pass mel_edi to compliance, never melanopic_lux.
spd: the SOURCE spectrum feeding these channels, when known (.spd path, 2-column text, or
[[nm, value], ...]). It is the spectrum at the LAMP, and mel_der is always reported at the
POINT: supplying it keeps the source's within-bin structure, which the channel averages cannot
represent, and combines it with the per-bin transport the channels reveal. Two extra fields come
with it — source_mel_der (the source's own) and transport_ratio (the two divided), so a room
that shifts the spectrum is visible rather than folded away. Without an SPD, mel-DER is inferred
from the channel averages alone: exact for D65, within ~1.5% for smooth spectra, up to ~8% high
for a narrow-band fluorescent. mel_der_source records which route ran.
| Name | Required | Description | Default |
|---|---|---|---|
| spd | No | ||
| channels | Yes | ||
| channel_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully owns behavioral disclosure. It transparently explains the difference between melanopic_lux and mel_edi, the effect of supplying an SPD (preserving within-bin structure, adding source_mel_der and transport_ratio), and the accuracy trade-offs when SPD is absent (exact for D65, ~1.5% for smooth spectra, up to ~8% high for narrow-band fluorescent). This goes beyond a simple 'computes X' and gives an agent a realistic model of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is roughly 200 words, which is on the longer side, but every sentence adds substantive value. It is front-loaded with the core purpose, then explains the output nuances, then the spd behavior. The structure is logical and easy to parse, with clear separation of concerns. No redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description is fairly complete. It covers the return format (single dict or list), the key output fields, the spd parameter's semantics and edge cases, and the behavioral differences between the two metric types. The only notable omission is an explanation of channel_type, which is a minor gap given that it has a default and likely represents a mode selector. Overall, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It thoroughly explains the spd parameter: what it is (source spectrum), its allowed forms ('.spd' path, 2-column text, or array), and why it matters (preserves within-bin structure). It also gives a brief hint about channels ('channel irradiances') in the opening line. However, the channel_type parameter is never mentioned, and channels is only indirectly described. Partial compensation for a critical gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear statement: 'Photopic / melanopic / neuropic equivalent illuminance from channel irradiances.' It specifies the resource (channel irradiances) and the output quantities. While it doesn't explicitly name sibling tools like spectral_metrics or alpha_opic, the domain is distinct enough that the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides practical guidance on interpreting results (e.g., 'pass mel_edi to compliance, never melanopic_lux') and explains when the spd parameter should be supplied. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or prerequisites. Usage is implied by the domain but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
colored_luminaireA
Inject a channel triplet into a luminaire .rad, writing a NEW file (never edits the input).
count: 0=blue,1=green,2=red third of 9 values. The colored definition is written to work_dir (client-roots aware) as .rad — the source rad_path is left untouched — and its absolute path is returned. rad_path may be a .rad file path or raw .rad text. Returns {file, rad}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| count | Yes | ||
| rad_path | Yes | ||
| work_dir | No | ||
| channels9 | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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, and it does so well. It clearly states the tool writes a new file, never edits the input, writes to a client-roots-aware work_dir, leaves rad_path untouched, returns an absolute path, and returns {file, rad}. This is strong transparency for a side-effecting file-generation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and information-dense, front-loading the core action and safety guarantee ('writing a NEW file (never edits the input)') before parameter specifics. Every sentence contributes distinct, useful information with minimal redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no annotations and 0% schema coverage, the description covers the main behavioral contract, output location, return value, and input flexibility. Minor gaps remain around optional parameter defaults (name, work_dir) and the exact structure of channels9, but the description is largely sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It gives useful semantics for count ('0=blue,1=green,2=red third of 9 values'), rad_path ('.rad file path or raw .rad text'), and implicitly name/work_dir via '<name>.rad' and 'work_dir'. However, channels9 is only loosely described as a 'channel triplet' and '9 values', leaving some ambiguity about its exact contents and ordering.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Inject a channel triplet into a luminaire .rad', and immediately clarifies the key distinction that it writes a NEW file rather than editing the input. This clearly separates it from generic material or radiance writing tools and makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance about when to prefer this tool over alternatives, nor any mention of when not to use it. While the description explains mechanics like rad_path accepting file paths or raw text, it does not state a use case or differentiate against sibling tools such as write_material or colored_sky.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
colored_skyA
Generate a colored Perez sky+sun Radiance definition.
mode 'spectra' (per-channel spectral scaling, runs gendaylit) or 'luminance' (Radiance -C built-in coloring, 3-channel only, pure emit). irrad_mode 'W' (direct+diffuse) or 'E' (global). diffuse_channels/direct_channels: 3 or 9 channel values (from spd_to_channels); ignored in luminance mode. lon is standard signed / EAST-positive (Seattle = -122.3, Athens = 23.73), matching raw EPW.
SOLAR POSITION. By default the sun is derived by gendaylit's own ephemeris from month/day/hour +
lat/lon/utc, and hour is read as a WALL-CLOCK instant. spectral_sky_from_epw's hour is a
different thing — an EPW hour-ENDING label, whose geometry is evaluated at the mid-interval
instant (hour - 0.5) because the row's DNI/DHI are averaged over the preceding hour. Passing the
same integer to both therefore puts the spectrum and the traced sky half an hour (7.5 deg of
diurnal arc) apart, with no error raised.
To keep them on one instant, pass that record's geometry through here VERBATIM:
sun_zenith_deg = record["geometry"]["zenith_deg"]
sun_azimuth_deg = record["geometry"]["azimuth_deg"]
Both are required together; supplied, they emit gendaylit's -ang form and make the record's
position authoritative for the traced geometry. Omitted, behaviour is unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | ||
| lat | No | ||
| lon | No | ||
| run | No | ||
| utc | No | ||
| hour | No | ||
| mode | No | spectra | |
| name | No | sky | |
| globl | No | ||
| month | No | ||
| direct | No | ||
| diffuse | No | ||
| work_dir | No | ||
| irrad_mode | No | W | |
| channel_type | No | ||
| sun_zenith_deg | No | ||
| direct_channels | Yes | ||
| sun_azimuth_deg | No | ||
| diffuse_channels | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so admirably. It discloses how mode affects execution (spectra runs gendaylit, luminance uses Radiance -C built-in coloring), how hour is interpreted as a wall-clock instant, and the subtle half-hour offset issue. It also notes that diffuse_channels/direct_channels are ignored in luminance mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but not wasteful; every sentence adds technical substance. It front-loads the core purpose and modes, then dedicates a focused paragraph to the solar-position gotcha. It could be slightly trimmed but is well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 19 parameters, the description covers the most critical behavioral aspects and the main integration pitfall. The output schema exists, so return values are not needed. Minor omissions like the exact role of channel_type and globl prevent a 5, but overall it is sufficiently complete for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description adds meaning to several key parameters: mode, irrad_mode, lon (explicit EAST-positive), hour (wall-clock vs EPW hour-ending), and the sun angle pair. However, it does not explain all 19 parameters (e.g., channel_type, globl, direct, diffuse, work_dir), leaving some to be inferred from context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource statement: 'Generate a colored Perez sky+sun Radiance definition.' It then distinguishes itself from the sibling spectral_sky_from_epw by explaining the hour semantics difference, so an agent can tell them apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use the default ephemeris versus passing sun_zenith_deg and sun_azimuth_deg, and it explains the alignment problem with spectral_sky_from_epw, including a concrete example of how to pass geometry verbatim. This is far beyond a generic 'when to use' note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complianceA
Check a value against a lighting standard.
standard: well_v2_l03 | brown_2022 | iso_cie_8995_1_2025 | en_17037 | en_12464_1 | ul_24480.
CIRCADIAN standards are scored on mel_edi (CIE S 026 mel-EDI -- NOT melanopic_lux, which is
larger by D65's melanopic/photopic ratio ~1.10 and would silently relax the threshold); eml is
accepted and converted. EML is the LARGER number -- EML = mel-EDI * 1.103 -- so an eml
input is DIVIDED by 1.103 to score it. Pass ONE of them: if both are given, mel_edi wins,
eml is discarded without warning, and the result is stamped quantity "mel_edi" with no
trace of the ignored input. To go the other way, from mel-EDI to EML, use
spectral_metrics(eml_edi_value=..., eml_edi_direction='medi_to_eml'); do not do the
arithmetic by hand. en_17037 returns "n/a" (daylight-provision, non-circadian) and
ul_24480 returns "unsupported" (Circadian Stimulus, not computed here).
standard="en_12464_1" is the ELECTRIC VISUAL-TASK path and ignores mel_edi entirely: pass
task (see EN_12464_1_TASKS / the hcl://compliance/en_12464_1 resource) plus the measured
em/ugr/uo/ra, and optionally the surround/background (em_surround, uo_surround, em_background,
uo_background) and wall/ceiling/cylindrical (em_wall, uo_wall, em_ceiling, uo_ceiling,
em_cylindrical, uo_cylindrical) values -- each relationship is evaluated only when supplied.
Supplying the task but no measured values returns "incomplete", never a vacuous "pass".
| Name | Required | Description | Default |
|---|---|---|---|
| em | No | ||
| ra | No | ||
| uo | No | ||
| eml | No | ||
| ugr | No | ||
| task | No | ||
| period | No | daytime | |
| em_wall | No | ||
| mel_edi | No | ||
| uo_wall | No | ||
| standard | No | brown_2022 | |
| em_ceiling | No | ||
| uo_ceiling | No | ||
| em_surround | No | ||
| uo_surround | No | ||
| daylight_met | No | ||
| em_background | No | ||
| uo_background | No | ||
| em_cylindrical | No | ||
| uo_cylindrical | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses the mel_edi vs eml precedence (mel_edi wins, eml discarded without warning), the conversion factor (eml = mel_edi * 1.103, so eml is divided by 1.103), the output quantity stamping, and the behavior for en_17037 and ul_24480. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized into logical paragraphs (circadian vs electric visual, edge standards). Every sentence contributes necessary information, but it could be tightened slightly (e.g., the conversion explanation is repeated in a few places). Still above average.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all parameter groups and explains edge-case return values. With an output schema present, it doesn't need to describe return format. For a 20-parameter tool with zero schema coverage, this is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains each parameter group: mel_edi/eml for circadian, em/ugr/uo/ra plus surround/background/wall/ceiling/cylindrical for electric visual, and the task parameter. It also clarifies the conversion factor and precedence, adding meaning far beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb ('check') and resource ('a value against a lighting standard'), then lists the accepted standards. It distinguishes itself from sibling tools like circadian_metrics and spectral_metrics by focusing on compliance checking rather than metric computation or spectral conversion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts the circadian path (mel_edi/eml) with the electric visual-task path (en_12464_1), notes which standards return 'n/a' or 'unsupported', and directs users to spectral_metrics for the reverse conversion. It also explains the condition under which en_12464_1 returns 'incomplete' instead of a vacuous pass.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
daylight_factorB
Daylight Factor (%) per point under the CIE Standard Overcast Sky (gensky -c).
DF = E_indoor / E_outdoor * 100, with E_outdoor traced from a sky-only exterior reference. scene_sets: the building scene as a single 3-channel list of .rad paths (materials + geometry); the overcast sky is added internally. points: inline rows or a .pts path, OR sensor_set='name'. Returns df_per_point + df_avg/df_min/uniformity + e_outdoor, or the command plan when not run.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | ||
| run | No | ||
| hour | No | ||
| month | No | ||
| points | No | ||
| quality | No | ||
| gnd_refl | No | ||
| work_dir | No | ||
| rad_params | No | ||
| scene_sets | Yes | ||
| sensor_set | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the overcast sky is added internally, that it returns df_per_point plus summary metrics and e_outdoor, and that it can return a command plan when run=false. It also explains the scene_sets structure. This is substantial behavioral context, though it does not mention side effects like file writes or computational cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with a formula and a bullet-like explanation of key inputs and outputs. It is reasonably concise and front-loaded with the definition. However, the bullet for scene_sets and points could be tighter, and the mention of 'command plan' is slightly cryptic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high parameter count (11) and no annotations, the description is not complete. It explains the core inputs (scene_sets, points, sensor_set) and the output format, but omits explanation for the other 7 parameters. Even with an output schema, the tool is too complex to rely on defaults without explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains scene_sets, points, sensor_set, and run (implicitly), but leaves many parameters (day, hour, month, quality, gnd_refl, work_dir, rad_params) unexplained. The agent must guess their meaning from the schema or defaults, which is inadequate for a tool with 11 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes Daylight Factor per point under the CIE Standard Overcast Sky, with a formula. It is specific about the resource (daylight factor) and scope (per point, overcast sky). However, it does not explicitly distinguish it from sibling tools like annual_daylight or lm83_daylight, though the mention of 'gensky -c' hints at a specific static sky model.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any guidance on when to use this tool versus alternatives. It does not mention conditions, exclusions, or prerequisites. An agent would have to infer the appropriate use case from the metric definition alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
daylight_savingsA
Automated daylight-responsive savings: daylight sim at the reference points -> lighting_controls.
mode='point_in_time' uses run_grid (scene_sets + points; supports multiple reference points); mode='annual' uses run_annual_daylight (channel_scenes + wea + points, 8760 h) and supports a multi-point grid (one weight per reference point) via points=[...] or sensor_set='name'. run=False emits the command plan without executing. An annual run elicits confirmation first (it is long); decline -> the emitted plan is returned.
weights: one per reference point, interpreted as that daylight zone's FLOOR-AREA FRACTION, so they must sum to <= 1.0 (NOT one-per-zone full-power flags -- e.g. [1, 1] is invalid; use [0.4, 0.3] etc.). The leftover (1 - Σweights) is the uncontrolled core area billed at full power. For a single point pass [1.0]. Compute proper fractions with hcl_core.lighting_controls.area_weights_from_geometry(width, length, window_head, task_height).
Return shapes: {"ran": False, ...commands...} (not executed); {"ran": True, "error": ..., "failed_step": ...} (a Radiance step failed mid-run); else {"ran": True, "mode": ..., "controls": ...} on success.
Note: in annual mode with schedule=None, the default weekday 08:00-18:00 mask is built to the
length run_annual returns and assumes an 8760-h, Monday-anchored (HOY 0 = Mon 00:00) series. If
run_annual is run over a sub-period or a non-Monday-anchored year, pass an explicit schedule.
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| wea | No | ||
| area | No | ||
| iset | No | ||
| mode | No | point_in_time | |
| fL_min | No | ||
| fP_min | No | ||
| points | No | ||
| n_steps | No | ||
| p_rated | No | ||
| quality | No | ||
| weights | No | ||
| schedule | No | ||
| work_dir | No | ||
| rad_params | No | ||
| scene_sets | No | ||
| sensor_set | No | ||
| channel_type | No | ||
| control_type | No | ContinuousOff | |
| channel_scenes | No | ||
| workbook_compat | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does an excellent job: it discloses the confirmation prompt for annual runs, the three return shapes, the weight interpretation (floor-area fraction, sum <= 1.0), and the schedule assumptions. This is far beyond the minimum and leaves no ambiguity about side effects or return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense; it front-loads the purpose and then systematically covers modes, weights, return shapes, and the schedule note. No sentence is wasted, but the density makes it a wall of text. It could benefit from bullet points or clearer section separation, but the structure is logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers high-level behavior, return shapes, and the critical weights/schedule semantics. However, it omits explanations for many parameters, and while it references underlying tools (run_grid, run_annual_daylight), the agent cannot safely call this tool without understanding those parameters. An output schema exists, but it lacks descriptions, so the description must do more. It is adequate for an expert but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains mode, points, sensor_set, weights, schedule, and run, and even gives a helper function for weights. However, 21 parameters exist, and many (area, iset, fL_min, fP_min, n_steps, p_rated, quality, work_dir, rad_params, scene_sets, channel_type, control_type, channel_scenes, workbook_compat) are left undocumented. This is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear purpose: 'Automated daylight-responsive savings: daylight sim at the reference points -> lighting_controls.' It names the two modes and the underlying functions (run_grid, run_annual_daylight). It is not a tautology, but it doesn't explicitly differentiate from sibling tools like run_grid or annual_daylight, so it misses the highest mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains when to use each mode (point_in_time vs annual) and the run=False behavior. It also provides a note about schedule assumptions for annual mode. However, it does not explicitly state when not to use this tool or name direct alternatives beyond the underlying functions, so it falls 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.
daysim_statusA
Report Daysim availability (ds_shortterm + epw2wea) via HCL_DAYSIM_BIN or PATH.
Returns {available, bin_dir, version, found, missing}. No subprocess run except a best-effort version probe. Daysim is built from source locally (never bundled); use build_daysim if missing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that no subprocess runs except a best-effort version probe, and notes Daysim is built from source locally (never bundled). These are meaningful behavioral traits beyond what a schema could express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a return line. Purpose is front-loaded, and the alternative is stated in a compact conditional. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return fields, so description needn't repeat them. It adds essential context about environment variable usage, source-built nature, and the fallback to build_daysim. For a status tool, this is complete enough; error behavior is implied by the 'found' field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is 100% vacuously. The description adds no parameter details, but none are needed. Baseline for 0 params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Report Daysim availability' with specific executables (ds_shortterm + epw2wea) and the mechanism (HCL_DAYSIM_BIN or PATH). It distinguishes from siblings like build_daysim (which builds) and radiance_status (which reports a different tool).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly mentions 'use build_daysim if missing', providing a conditional alternative. While it doesn't compare to radiance_status or other status tools, the context makes the intended use obvious. The alternative guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_subhourly_weaA
EPW -> sub-hourly broadband .wea via Daysim (epw2wea -> .hea -> ds_shortterm).
timestep_min default 6 (0.1 h) satisfies the nvRD step guard. Site location defaults to the EPW's own LOCATION line (converted to the DAYSIM convention), so normally you only pass the epw + work_dir. Pass explicit latitude/longitude/time_zone/site_elevation only to override — and only in DAYSIM convention: WEST-positive longitude, time_zone in DEGREES (= -15 × UTC offset); do NOT pass raw EPW East-positive coordinates. Runs Daysim if present, else returns the command plan + the written .hea so you can build Daysim and run it yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| epw | Yes | ||
| run | No | ||
| latitude | No | ||
| work_dir | No | ||
| longitude | No | ||
| time_zone | No | ||
| solar_time | No | ||
| timestep_min | No | ||
| site_elevation | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 richly: it discloses the default timestep satisfying the nvRD step guard, the site-location default derived from the EPW LOCATION line, the DAYSIM coordinate convention (WEST-positive longitude, time_zone in degrees = -15 × UTC offset), and the fallback behavior when Daysim is absent (returns command plan + written .hea). This is substantial 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but information-efficient, front-loading the core pipeline and putting the most critical caveat (coordinate convention) in the middle where the override discussion lives. Every sentence adds value; it could benefit from minor structuring but is far from bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are already covered. For a 9-parameter, Daysim-integrated pipeline tool with zero annotations, the description explains defaults, conventions, and fallback behavior well. Remaining gaps are the unexplained solar_time and run parameters, which keep it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains epw, work_dir, timestep_min (default 6), and the coordinate overrides with their DAYSIM convention. However, solar_time and run (a boolean) are never mentioned, leaving two of nine parameters semantically unexplained. Coverage is good but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific transformation chain 'EPW -> sub-hourly broadband .wea via Daysim (epw2wea -> .hea -> ds_shortterm)', naming the exact input, output, and pipeline. This clearly distinguishes it from weather-related siblings like weather, import_weather, spectral_epw, and atmosphere_from_epw, all of which do different things.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent the normal invocation ('normally you only pass the epw + work_dir') and conditions the override parameters on explicit intent ('Pass explicit latitude/longitude/time_zone/site_elevation only to override'). It does not explicitly name alternative tools or state when not to use it, but the default-vs-override guidance is clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_referenceB
Look up HCL reference content. topic: bins | coefficients | caveats | overview.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | overview |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Look up' implies a read-only operation, but the description does not explicitly state non-destructiveness, authorization requirements, or any side effects. It also doesn't disclose the return format or pagination behavior, leaving agents without crucial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded with the core purpose. The topic list is a compact addition. No wasted words, though it is so brief that it might under-specify, which slightly lowers the score from a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter) and the presence of an output schema, the description could be minimal. However, it doesn't mention any prerequisites, disambiguation from the 'reference' sibling, or edge cases. For a lookup tool with many siblings, more context would be expected to ensure correct selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates by explicitly enumerating the valid topics: bins, coefficients, caveats, overview. This gives the agent concrete guidance on parameter values beyond the raw schema, which only declares a default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'look up' and the resource 'HCL reference content', and lists specific topics. However, it does not differentiate from the sibling tool 'reference', which likely serves a similar purpose, so it loses a point for not addressing sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of exclusions or when to prefer another tool, such as the sibling 'reference'. This is a significant gap for a tool with many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
glare_ugrC
Render a fisheye (daylight and/or electric_lights) and run evalglare -> UGR/DGP/glare sources.
Delegates to run_image with glare=True. Runs Radiance if present, else returns the commands.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| run | No | ||
| view | No | -vta -vh 180 -vv 180 | |
| quality | No | ||
| work_dir | No | ||
| rad_params | No | ||
| scene_sets | Yes | ||
| channel_type | No | ||
| glare_params | No | ||
| electric_lights | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 does disclose a key behavioral trait: 'Runs Radiance if present, else returns the commands.' This explains the conditional execution and whether it mutates or returns commands. However, it does not mention side effects like file creation, permissions, or the nature of the output beyond returning commands, which is incomplete for a rendering and analysis tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at two sentences with the main purpose front-loaded. The delegation detail is somewhat implementation-specific but not excessive. There is no wasted phrasing, and it gets to the core function quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 11 parameters (1 required) and no parameter descriptions, the description is far from complete. It does not explain the output format (even though an output schema exists, it is not referenced), the meaning of UGR/DGP/glare sources, or how to interpret the returned commands vs actual execution. The conditional behavior is mentioned but not elaborated. An agent would struggle to call this correctly without additional info.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining parameters. It only hints at 'daylight and/or electric_lights' which maps to the electric_lights parameter, but it does not explain scene_sets (the only required parameter), glare_params, rad_params, quality, or others. This is a significant gap; the description adds almost no semantic value for parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renders a fisheye image and runs evalglare to compute UGR/DGP/glare sources. It uses specific verbs ('Render', 'run') and names the resource (fisheye, evalglare). It distinguishes itself from siblings like run_image by noting it delegates with glare=True, implying a specialized glare analysis tool, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for glare analysis and mentions it delegates to run_image, but it does not explicitly state when to use this tool versus alternatives like run_image or other analysis tools. There is no mention of exclusions or conditions beyond the delegation, so usage guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
glass_transmissivityA
Convert glazing transmittance (0-1) to Radiance transmissivity. Accepts a number or list.
Transmittance (Tvis, the datasheet number) and transmissivity (the value a Radiance glass primitive takes) are NOT the same: transmissivity is always the larger, e.g. 0.70 -> 0.763.
USE THIS ONLY when hand-writing a Radiance glass primitive. Do NOT pre-convert for
write_material(material_type=0) or for an import_geometry material_map
{"type": "glass", "tvis": ...} -- both run this same conversion internally, so feeding
them 0.763 yields 0.831 (~9% high) and silently inflates every downstream daylight and
mel-EDI result. Those two take the raw datasheet Tvis.
The float|list annotation is load-bearing: without it FastMCP emits an empty arg schema and delivers the value as a string, so the core's transmittance-squared term would raise (DEF-1).
| Name | Required | Description | Default |
|---|---|---|---|
| transmittance | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral burden. It discloses that transmissivity is always larger, gives a numeric example, explains the internal transmittance-squared term, and even warns about the load-bearing float|list annotation and the DEF-1 error. This is far beyond what annotations would normally cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds critical value: purpose, definition, usage rule, alternatives with consequence, and an annotation note. It is front-loaded with the core purpose and uses clear formatting (bold 'USE THIS ONLY') to guide the agent. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter, an output schema (which presumably covers return type), and no annotations, the description covers everything an agent needs: what it does, when to use it, when not to, why, and even a technical caveat about schema generation. It is fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain the parameter. It does: 'transmittance' is defined as the datasheet number (Tvis) in the 0-1 range, accepts a number or list, and the conversion logic is detailed. The single parameter is completely documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource ('Convert glazing transmittance to Radiance transmissivity') and immediately clarifies the conceptual difference between Tvis and transmissivity, distinguishing it from any conversion that might be assumed. It also explicitly names the siblings (write_material, import_geometry) that should NOT use this tool, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit 'USE THIS ONLY' condition (hand-writing a Radiance glass primitive) and provides a clear negative: do not pre-convert for write_material or import_geometry, with a concrete consequence (9% error). It names alternatives and explains why they take raw Tvis, leaving no room for misapplication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ies_analyzeA
Parse an IESNA LM-63 luminaire and return its photometric report (rated lumens, watts, efficacy, max candela + location, beam/field angles, zonal flux down/up, LOR).
ies: raw IES text or a file path.
| Name | Required | Description | Default |
|---|---|---|---|
| ies | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 states the output but does not mention side effects, error handling, whether the operation is read-only, or limitations (e.g., invalid IES handling). It does not contradict any annotations (none exist), but it falls short of disclosing key behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two sentences that front-load the primary purpose and output list, followed by a clear parameter explanation. There is no wasted wording; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (indicated as true), the description need not detail return values beyond the enumerated fields, which it already lists. It also explains the input parameter format. However, it omits any mention of error conditions or prerequisites, and lacks sibling differentiation, which slightly reduces completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It explains the parameter 'ies' as 'raw IES text or a file path', which adds meaningful semantics beyond the bare string type. This clarifies the accepted input formats, making the tool more usable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'parse' and the resource 'IESNA LM-63 luminaire', and enumerates the specific fields returned (rated lumens, watts, efficacy, max candela + location, beam/field angles, zonal flux down/up, LOR). This is specific and distinguishes the tool from siblings like ies_to_radiance (which converts to radiance) or validate (which checks validity).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as ies_to_radiance or validate. There is no mention of prerequisites, exclusions, or recommended scenarios. The only implied usage is when a photometric report is needed, but no explicit when/when-not guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ies_to_radianceB
Convert an IES luminaire to a Radiance .rad via ies2rad, optionally placed via xform.
-m carries user scaling only (multiplier * maintenance_factor); ies2rad applies the IES candela/ballast/pfactor itself. Runs ies2rad if Radiance is present, else returns the commands.
| Name | Required | Description | Default |
|---|---|---|---|
| ies | Yes | ||
| run | No | ||
| lamp | No | ||
| color | No | ||
| units | No | ||
| work_dir | No | ||
| placement | No | ||
| multiplier | No | ||
| out_prefix | No | ||
| units_divisor | No | ||
| maintenance_factor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It explains that user scaling (multiplier * maintenance_factor) is separate from ies2rad's internal candela/ballast/pfactor application, and that execution is conditional on Radiance presence. These are valuable behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core action and a focused note on scaling behavior. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema, the description leaves most parameter semantics and operational details (e.g., placement structure, default behaviors, output format) unexplained. For an 11-parameter tool, this is a significant gap that an agent must resolve by trial or external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only multiplier and maintenance_factor are explained through the scaling note; the other nine parameters (ies, run, lamp, color, units, work_dir, placement, out_prefix, units_divisor) are left undocumented. With 0% schema coverage, the description fails to compensate adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific conversion action: converting an IES luminaire to a Radiance .rad via ies2rad, with optional xform placement. It is clear and distinct from siblings like ies_analyze, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for IES-to-Radiance conversion but does not contrast with other tools. It does provide a conditional execution note (runs ies2rad if Radiance is present, else returns commands), which guides expectations but not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_geometryA
Import a Wavefront .obj room into a per-channel Radiance scene (obj2rad -> xform).
material_map: {group_name: spec} keyed by OBJ usemtl (else g) names; unmapped groups hard-fail. spec is a library-name string (illustrative reflectance) or a dict {"type": "plastic"|"glass"|"ground"|"context"|"luminaire"|"floor", "refl"/"tvis": float, ...}: plastic=opaque diffuse; glass=transmitting; ground=opaque + drives ground_albedo; context=exterior shading (in oconv, excluded from sensor footprint/room-sanity); luminaire=marker + IES (-> electric_lights); floor=opaque + anchors the sensor footprint. units: mm|cm|m|ft. up_axis: Y|Z.
v2/v3 parameters:
north_angle_deg: clockwise azimuth (degrees) that post-remap +Y points toward; applied as -rz(-north) after up-axis correction.
dry_run=True: return a discovery payload (groups, bbox_m, mesh_quality, suggestions) without binding materials or running Radiance. material_map not required in dry_run mode.
sidecar: path to a JSON file supplying defaults (explicit kwargs always win over sidecar).
derive_sensors: derive a work-plane grid + eye-level observer_sets (at BOTH seated 1.2 m and standing 1.6 m by default) + DGP-view strings from the geometry.
eye_heights / workplane_h / spacing: tune the derived-sensor layout (defaults (1.2, 1.6) / 0.8 / 0.6).
annotate: build a colored-by-material falsecolor render (oconv -> rpict -> falsecolor; live-validated).
strict: raise GeometryHealthError when the embedded health report (result["health"]) holds error-severity findings (e.g. coincident surfaces), instead of returning a report that looks plausible but is built on defective geometry. strict has NO effect when dry_run=True: the dry_run path returns before materials are bound, so no health report is computed to raise on.
Returns geometry_set + material_sets (index-aligned per channel-set) to compose into
run_grid / run_annual scene_sets, plus discovered groups and warnings, an always-present
apertures report, and a provenance manifest (written as a manifest.json sidecar -> manifest_path,
and embedded as a #-comment header in each geometry .rad). Conditional keys appear only when their
feature is mapped/requested: ground_albedo/ground_albedo_kind (a 1-nm albedo from any type:"ground"
group -> feed to spectral_sky_from_epw(spectral_albedo=...)); electric_lights (drop-in luminaire
payload for run_grid/run_image, which run ies2rad + colorize); context_groups (type:"context"
exterior-shading groups); and grid_points/observer_sets/observer_points/glare_views (derive_sensors).
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| units | No | ||
| strict | No | ||
| dry_run | No | ||
| sidecar | No | ||
| spacing | No | ||
| up_axis | No | ||
| annotate | No | ||
| obj_path | Yes | ||
| work_dir | No | ||
| eye_heights | No | ||
| workplane_h | No | ||
| channel_type | No | ||
| material_map | No | ||
| derive_sensors | No | ||
| north_angle_deg | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden, and it delivers: unmapped groups 'hard-fail', dry_run 'return[s] a discovery payload ... without binding materials or running Radiance', strict raises GeometryHealthError on error-severity findings, and it explicitly flags the subtle interaction that 'strict has NO effect when dry_run=True'. It also discloses conditional keys appearing only when requested, the manifest sidecar write, and live-validation for annotate. This is exceptional disclosure, including an edge-case interaction most tools omit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the length is earned given 16 params, 0% schema coverage, and no annotations. The core purpose is front-loaded, parameters are grouped under a 'v2/v3' section, and return/conditional keys are clearly enumerated. The material_map specification is a dense run-on paragraph that is harder to parse than the rest, but every sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and the description still details returns (geometry_set, material_sets, apertures, manifest, conditional keys), which is thorough. But for a 16-param tool it leaves run, work_dir, and channel_type completely unexplained, and it gives no guidance for distinguishing from closely-related siblings like check_geometry or preview_scene. Those gaps keep it from being complete despite the strong behavioral and parameter coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does heavily: it adds enum-like values (units: mm|cm|m|ft; up_axis: Y|Z), fully specifies material_map's keying and every type-dict (plastic/glass/ground/context/luminaire/floor), and explains north_angle_deg (applied as -rz(-north)), sidecar precedence ('explicit kwargs always win'), and defaults for eye_heights/workplane_h/spacing. The gap: three params — run, work_dir, and channel_type — are never mentioned, leaving their semantics entirely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+destination: 'Import a Wavefront .obj room into a per-channel Radiance scene (obj2rad -> xform)'. This is unmistakable against siblings like run_grid/run_image (simulation runners), check_geometry, and preview_scene. The derived-sensor outputs (grid_points/observer_sets) could be mistaken for the workplane_grid/observer_points siblings, but the description clearly frames these as outputs of this import tool rather than the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong pipeline context: returned scene_sets are 'to compose into run_grid / run_annual', luminaire payload is 'drop-in ... for run_grid/run_image', and ground_albedo is meant to 'feed to spectral_sky_from_epw'. It also explains dry_run's discovery role. However, it never explicitly states when NOT to use it or names an alternative for a given condition, so the when-vs-other guidance is implicit through workflow positioning rather than direct exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_weatherA
Ingest a .wea (DNI/DHI per timestamp) and/or decompose an analysis period into HOY + wea line numbers.
Returns wea_summary (record count, first/last timestamp, DNI/DHI ranges) rather than the full
per-hour arrays — those reach up to 8760 rows and overflow the response budget. Use period +
subset_out to get the rows you actually need (HOY/wea_lines in decomposed, the subset .wea on disk).
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | ||
| wea_path | No | ||
| subset_out | No | ||
| timestep_min | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavior itself. It reveals that the tool returns a summary (wea_summary) rather than full arrays, explaining the response budget constraint, and mentions that the subset .wea is written to disk. This is meaningful behavioral context beyond the schema, though it does not address auth, reversibility, or side effects beyond file creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two short paragraphs. The primary purpose is stated upfront, followed by important behavioral details. It avoids unnecessary fluff and front-loads the key information, though it could be slightly tighter by merging the two paragraphs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and the description summarizes the return value (wea_summary contents). It also covers the main use cases and limitations (response budget). For a tool with four optional parameters and a straightforward purpose, the description is largely complete, though edge cases and error handling are not mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate. It explains the purpose of period and subset_out, but does not mention wea_path or timestep_min. The description adds value for two of four parameters, leaving the others to be inferred from names and defaults. This is partial compensation for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: ingest a .wea file and/or decompose an analysis period into HOY and wea line numbers. It uses specific verbs (ingest, decompose) and identifies the resource (.wea). However, it does not explicitly contrast with sibling tools like weather or generate_subhourly_wea, so the differentiation is implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on using period + subset_out to get the needed rows, which helps with parameter usage. However, it does not explicitly state when to choose this tool over alternatives or provide conditions for when not to use it. The context is clear but lacks explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lighting_controlsA
Daylight-responsive lighting-control calculator (EnergyPlus §7.3.5; verified vs elec_lights.xlsx).
Point-in-time: pass itot_per_point=[lx at each reference point] -> {fL, fP, FP, P_elec, P_saved, reduction}. Annual/series: pass itot_series=[[lx per point] per hour] + area -> {per_hour, annual_kwh, annual_kwh_per_m2, mean_FP, mean_reduction, occupied_hours}. weights are the per-point area weights (e.g. from area_weights_from_geometry). control_type: ContinuousOff (default) | Continuous | Stepped. workbook_compat=True reproduces the elec_lights.xlsx off-gates (regression).
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | ||
| iset | No | ||
| fL_min | No | ||
| fP_min | No | ||
| n_steps | No | ||
| p_rated | No | ||
| weights | No | ||
| schedule | No | ||
| itot_series | No | ||
| control_type | No | ContinuousOff | |
| itot_per_point | No | ||
| workbook_compat | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the calculation behavior, the output fields for both modes, the role of weights, and the effect of workbook_compat. It does not mention error handling or edge cases, but for a pure calculator this is less critical. The mention of verification and regression adds transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and information-rich, with a clear lead statement about the tool's purpose and modes. It uses colons and examples to structure information efficiently. While it is longer than a typical description, every sentence carries meaningful information, and the structure makes it scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex with 12 parameters and no output schema provided. The description covers the primary usage modes and output fields, but it does not explain all parameters or provide units or defaults beyond what is in the schema (which is minimal). Given the complexity and lack of schema coverage, more detail would be needed for full completeness, but the description is adequate for the main use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description must explain parameters. It explains itot_per_point, itot_series, weights, control_type, and workbook_compat, but omits area, iset, fL_min, fP_min, n_steps, p_rated, and schedule. Some may be inferable from context (e.g., area is needed for annual mode), but several remain unexplained. The description adds value for the key parameters but does not fully compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is a 'Daylight-responsive lighting-control calculator' with a specific reference (EnergyPlus §7.3.5) and verification. It distinguishes itself from siblings by being a calculation tool, not a status or validation tool. The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage modes: point-in-time and annual/series, with instructions on which inputs to pass for each. It explains the meaning of 'weights' and 'control_type' and mentions 'workbook_compat' for regression. However, it does not explicitly state when to use this tool over alternatives like lm83_daylight or annual_daylight, though the mode-specific instructions give strong contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_presetsA
List available illuminant presets (CIE standards + illustrative LED models), or fetch one by name.
Names: D65, D50, A, FL1..FL12, and the illustrative LED models LED_3000K/4000K/5000K/BLUEPUMP/VIOLETPUMP (flagged illustrative, not measured - see spec 5.7). Returns SPD + metadata when a name is given.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that LED models are illustrative and not measured (referencing spec 5.7), and states the return behavior when a name is given (SPD + metadata). It does not explicitly state it is read-only, but that is implied by a list/fetch operation. The data-quality caveat adds valuable context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary action, then the list of names and the behavioral distinction. No wasted words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (per context signals), so return structure is already covered. The description covers the optional parameter semantics, the data-quality caveat, and the two usage modes. For a simple list/get tool, this is complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines a nullable string 'name' with no description (0% coverage). The description explains that omitting it lists all presets, while providing it fetches that specific preset's SPD and metadata. This fully clarifies the parameter's effect, adding meaning that the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (list/fetch) on illuminant presets, enumerates the exact preset names, and clarifies it covers CIE standards plus illustrative LED models. This distinguishes it from the sibling 'presets' tool by its focus on illuminant presets, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes two usage modes: call with no name to list all presets, or provide a name to fetch a specific preset's SPD and metadata. It lists the valid names and the illustrative caveat. It does not explicitly contrast with the sibling 'presets' tool, but the self-contained instructions are sufficient for an agent to decide when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lm83_daylightA
IES LM-83-12 sDA(300/50%) and ASE(1000,250h) with MANDATORY operable blinds.
Unlike annual_daylight, which computes the arithmetic of sDA/ASE on whatever shading the scene happens to contain, this runs LM-83's method: a three-phase (V.T.D.s) engine per window group, an hourly blind that closes when 2.2.6's direct-sun trigger fires, and a zero-bounce ASE pass with blinds retracted and no sky or ground (3.2.6, 3.3).
obj_path + material_map: the same OBJ room and material mapping import_geometry takes. Glazing must be mapped {"type": "glass", "tvis": ...} -- window groups are formed from those faces, and with no glass face there is no window to operate.
units (mm|cm|m|ft) and up_axis (Y|Z) describe the OBJ, defaulting to metres and Z-up; north_angle_deg is the clockwise azimuth post-remap +Y points toward. These decide the facade azimuths that window grouping keys on, so a wrong up_axis silently regroups the windows.
points: inline rows or a .pts path, OR sensor_set='name'. Grid spacing, workplane height and wall offset are MEASURED from these coordinates and reported, never accepted as parameters.
areas: 2.2.6 trigger areas, [{name, area_m2, point_indices}], split by facade orientation and each under 10,000 sf -- the trigger must hold in EVERY area, and pooling facades dilutes the fraction so blinds close later than the standard requires. Omit and pass floor_area_m2 to get a single whole-grid area, which is only correct for a single-facade space. An area over 10,000 sf is refused before any Radiance runs.
blind: the operable shade, per 2.2.7. Omitted -> the unknown-shade default of 5% diffuse VLT. {"shade_type": "fabric", "vlt": .., "openness": ..}, {"shade_type": "louver", "reflectance": >0.8} for the 20% white-louver branch, or {"bsdf": "path.xml"} for a measured Klems file. Note the default is 5%, NOT 20% -- the 20% figure is the louver branch and needs a declared reflectance.
window_groups: optionally declare grouping instead of auto-clustering by azimuth and plane, [{name, face_indices, role}] with role 'view' or 'clerestory' -- 2.2.6 asks that view groups close before clerestory ones, and role cannot be inferred from azimuth.
declared_no_blinds: assert the design documents state no blinds (2.2.6's escape clause). Reported as a per-group condition; it never replaces the headline, which always operates blinds.
Returns metrics (sDA, ASE, per_point_DA, conditions) plus blind_hours and the window
groups. The conformance flag is lm83_method_conformant and is presently ALWAYS FALSE:
2.2.8-2.2.11's model-input clauses (dirt depreciation, frame occlusion, reveals,
obstructions, interior reflectance defaults, mandatory furniture) are out of scope, so
glazing runs at its raw tvis and sDA is biased upward -- roughly 32% of transmitted flux
on an unknown-frame vertical window. Read metrics.conditions.departures before quoting
a number; this is not by itself an LM-83 or LEED submission.
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| wea | Yes | ||
| areas | No | ||
| blind | No | ||
| units | No | m | |
| points | No | ||
| quality | No | ||
| up_axis | No | Z | |
| d_params | No | ||
| latitude | No | ||
| obj_path | Yes | ||
| v_params | No | ||
| work_dir | No | ||
| sensor_set | No | ||
| material_map | Yes | ||
| floor_area_m2 | No | ||
| window_groups | No | ||
| north_angle_deg | No | ||
| declared_no_blinds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the conformance flag is always false, the bias from missing frame occlusion, the blind default (5% not 20%), and the area pooling dilution effect. It also explains the three-phase engine and blind trigger behavior. All critical behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but each sentence earns its place. It is organized into clear paragraphs by parameter group, front-loads the core purpose and sibling distinction, then dives into details. There is no fluff or repetition; every sentence adds critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (19 params, no schema descriptions, complex standard compliance), the description covers all needed aspects: engine method, parameter semantics, defaults, constraints, output structure (metrics, conditions, conformance flag), and limitations. The presence of an output schema helps, but the description provides the required behavioral and usage context fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain every parameter. It does: obj_path, material_map (including glazing mapping requirements), units/up_axis/north_angle_deg (with consequences of wrong values), points/sensor_set, areas (with constraints and fallback), blind (including subtypes and defaults), window_groups, and declared_no_blinds. Each parameter's purpose and constraints are described in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes IES LM-83-12 sDA/ASE with mandatory blinds, and explicitly contrasts it with annual_daylight, which computes arithmetic sDA/ASE on the scene's existing shading. This distinguishes the tool from its sibling and specifies the exact resource and verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Unlike annual_daylight...' and explains when to use this tool vs. the sibling. It also gives conditions for using areas, blinds, window_groups, and declared_no_blinds, and warns about pooling facades and area size limits. This is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_briefA
Load a study brief (empty skeleton if none). Call at journey start to resume where you left off.
| Name | Required | Description | Default |
|---|---|---|---|
| study | Yes | ||
| work_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a key behavioral trait: returns an empty skeleton if no brief exists, and implies state persistence. With no annotations provided, the description carries the burden and does so adequately, though it doesn't mention side effects or authentication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words, front-loading the main action and the key behavior. The structure is efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers usage context and the empty skeleton case, and the output schema handles return format. However, the lack of parameter explanations means the tool is not fully usable without external knowledge, making it only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no information about the 'study' or 'work_dir' parameters. With schema description coverage at 0%, the agent gets no guidance on what values to pass, leaving a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Load a study brief') and the resource (a brief), and adds the nuance of returning an empty skeleton when none exists. This makes it unambiguous and distinct from the sibling 'save_brief'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call at journey start to resume where left off, providing clear when-to-use guidance. It also implies the behavior when no brief exists, which helps the agent decide to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvrdA
Light-driven alerting response over time (Amundadottir nvRD).
spectral_series: per-timestep spectral irradiance rows (311 pts 390-700 nm, or 401 pts 380-780) as an inline list, OR a path to a text/CSV file with one row per line. PREFER THE FILE PATH for large/full-resolution series: a big inline array can be truncated over the MCP wire (e.g. 401-pt rows arriving as 367) and then fail the row-length check. Rows must be a SINGLE point+view orientation, in CHRONOLOGICAL order, ideally uniformly spaced at timestep_h. Pre-group multi-orientation/multi-day data and call once per orientation (§9.4 — the source's automatic per-orientation grouping is not reproduced in v1). timestep_h: hours per step. Must be <= 0.3 and yield odd nvRD filter lengths; the model is validated at 0.1 (= 6 min), the recommended value. Other steps raise ValueError. You supply the series (no Daysim). hours: optional explicit per-timestep hour vector for non-uniform spacing; must be monotonically non-decreasing. When omitted, a uniform grid (i*timestep_h) is used. Returns effective_irradiance, relative_response, and cumulative_response per timestep.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| timestep_h | No | ||
| spectral_series | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 wire truncation risk for inline arrays, row-length check failures, required single orientation and chronological order, ValueError for invalid timestep_h, and monotonic hour requirements. It also lists all three return outputs. This is exceptional transparency about edge cases and behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries operational necessity, structured with parameter explanations. It is front-loaded with the purpose and does not contain padding. Slightly more conciseness could be achieved but the detail is justified by complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters, no annotations, and an output schema not shown but return values described, the description covers input formats, constraints, error conditions, and outputs. An agent has all necessary information to call the tool correctly, including caveats about orientation and file handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain parameters. It does: spectral_series format and file path recommendation, timestep_h constraints and recommended value, hours optional and monotonic. This adds substantial meaning beyond the schema's basic type definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes 'Light-driven alerting response over time' using the Amundadottir nvRD model, which is a specific verb+resource. It is distinct from siblings like annual_nvrd by focusing on a single time series, but it does not explicitly name alternatives, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed constraints for using this tool (timestep_h <= 0.3, recommended 0.1, chronological order, file path preference) and instructs to pre-group multi-orientation data. However, it never states when to use this tool instead of similar siblings like annual_nvrd or circadian_metrics, so the usage context is implicit but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
observer_pointsA
Workstation eye-point observers from an OBJ room.
Auto-detects seat objects (seat_pattern) paired to screen objects (screen_pattern) by trailing suffix: eye = seat centroid at floor-top+eye_height, gaze = eye->screen centroid (dz=0). Fallback when no screen: direction_fallback in {window, azimuth, sweep}. No seats: position_fallback. Pass workstations=[{eye:[x,y], target:[x,y]|azimuth}] to bypass detection. Returns observers + glare_views (DGP fisheye) + a .pts. material_map OR sidecar required. clip_to_footprint (default True) does NOT move observers (they are furniture-anchored) — it only reports, via a warning, any observer whose eye position falls outside the floor slab.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | ||
| sidecar | No | ||
| sweep_n | No | ||
| up_axis | No | ||
| obj_path | Yes | ||
| work_dir | No | ||
| write_pts | No | observers.pts | |
| eye_height | No | ||
| material_map | No | ||
| seat_pattern | No | (?i)chair.*seat|seat | |
| workstations | No | ||
| screen_pattern | No | (?i)disp.*panel|screen|monitor|display | |
| north_angle_deg | No | ||
| fallback_azimuth | No | ||
| clip_to_footprint | No | ||
| position_fallback | No | room_center | |
| direction_fallback | No | window |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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, and it does well: it discloses the non-obvious clip_to_footprint behavior (does NOT move observers, only warns), the material_map OR sidecar requirement, the fallback chain, and the return payload. This goes well beyond what the schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense with the purpose front-loaded and every sentence carrying meaning. It loses a point for structural jumbling — the return statement and 'material_map OR sidecar required' are awkwardly dropped mid-paragraph rather than cleanly separated — but there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 17-param tool with 0% schema coverage and no annotations, the description covers the core algorithm, fallbacks, bypass, and key behavioral caveats. An output schema exists so return values are partially covered. The main gaps are the six unexplained parameters and the absence of error behavior, leaving the agent to guess at units, sweep_n, and coordinate conventions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It meaningfully explains workstations (with exact format), eye_height (floor-top+eye_height), direction_fallback (in {window, azimuth, sweep}), position_fallback, clip_to_footprint, and the material_map/sidecar requirement. But it leaves several params unexplained (units, up_axis, sweep_n, north_angle_deg, fallback_azimuth, work_dir), so compensation is partial for a 17-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: generating workstation eye-point observers (with gaze vectors) from an OBJ room. It clearly distinguishes itself from sibling tools like workplane_grid, photosensors, and sensors by describing the pairing of seat to screen objects and the eye/gaze computation. The verb and resource are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it — when workstation eye-point observers and glare views are needed — and details the auto-detection/fallback/bypass logic. However, it never explicitly names alternatives or states when NOT to use it, leaving differentiation from the many related geometry tools (workplane_grid, sensors, photosensors) implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photosensorsA
Daylight-dimming photosensors from an OBJ room (methodology.md §3).
Locates the dominant glazed facade, builds sidelighting zones from the window head height (zone_rule='head_height' with depth_factors like [1,2], or 'ies_2.5'), and places one horizontal sensor per zone at sensor_fraction of the zone depth, centred on the facade and clipped to the floor. mount='workplane' (z=floor+workplane_h, up) or 'ceiling' (down). Returns points [x,y,z,dx,dy,dz] + a per-zone methodology; writes a .pts. material_map OR sidecar required (to identify floor & glazing).
| Name | Required | Description | Default |
|---|---|---|---|
| mount | No | workplane | |
| units | No | ||
| sidecar | No | ||
| up_axis | No | ||
| obj_path | Yes | ||
| work_dir | No | ||
| write_pts | No | photosensors.pts | |
| zone_rule | No | head_height | |
| task_height | No | ||
| workplane_h | No | ||
| material_map | No | ||
| depth_factors | No | ||
| north_angle_deg | No | ||
| sensor_fraction | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the core behavior: dominant facade detection, zone building, sensor placement at sensor_fraction, mount orientation details, return format, .pts file writing, and required inputs. It does not cover failure modes or edge cases, but it is substantially transparent about what the tool does.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient: front-loaded with the tool's purpose, then algorithmic steps, geometry details, outputs, and requirements. Every sentence conveys essential information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex geometric tool, the description covers the main workflow, output format, mount behavior, and required inputs. It even references methodology.md for deeper detail. It is not fully complete because several optional parameters are not explained, but it is adequate for a typical default call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters, and it does for key ones: zone_rule, depth_factors, sensor_fraction, mount, workplane_h, material_map/sidecar, and the .pts output. However, it leaves several parameters unexplained (units, up_axis, task_height, north_angle_deg, work_dir), which is a meaningful gap for a 14-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is clear that this tool generates daylight-dimming photosensor points from an OBJ room: it locates, builds, and places sensors and returns point coordinates. It does not explicitly distinguish itself from sibling tools like 'sensors' or 'workplane_grid', but the specific algorithm and daylight-dimming context make the purpose sufficiently clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides solid context: it applies to an OBJ room with a glazed facade, and it states that material_map OR sidecar is required to identify floor and glazing. It does not explicitly say when to choose this tool over alternatives, but the technical context and prerequisites give clear enough usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
presetsA
List available illuminant presets (CIE standards + illustrative LED models), or fetch one by name.
Names: D65, D50, A, FL1..FL12, and the illustrative LED models LED_3000K/4000K/5000K/BLUEPUMP/VIOLETPUMP (flagged illustrative, not measured - see spec 5.7). Returns SPD + metadata when a name is given.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that some presets are illustrative (not measured, see spec 5.7) and that a named fetch returns SPD + metadata. This covers the key behavioral aspects for a list/fetch tool, though it doesn't mention side effects (likely none) or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, and every clause earns its place. The name enumeration is compact and the spec reference is useful without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple list/fetch behavior and the presence of an output schema, the description covers the essential context: available presets, the illustrative flag, and the return format. It doesn't describe behavior when no name is given (implied as listing all), but that's minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates fully by enumerating all valid preset names (D65, D50, A, FL1..FL12, LED models) and explaining the effect of providing the 'name' parameter. This is exactly the semantic detail an agent needs beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists illuminant presets or fetches one by name, which is a specific verb+resource. It distinguishes from generic preset tools by specifying 'illuminant presets', though it doesn't explicitly contrast with the sibling 'list_presets' or 'quality_presets'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use it to list or fetch illuminant presets. It doesn't explicitly state when to prefer this over alternatives like 'list_presets' or provide exclusions. The context is clear but no alternative routing is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_sceneA
matplotlib PNG preview of a room with sensor overlays (plan + 3D).
render: 'grid' (grid, plan+3d), 'observers' (plan), 'observers_3d' (3d), or 'all' (all layers, plan+3d). Point layers are given as .pts paths OR inline [x,y,z,dx,dy,dz] rows in the post-north frame; layers left None are simply omitted. Diagnostic overlays only — not a photometric render. material_map OR sidecar required.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | ||
| render | No | all | |
| sidecar | No | ||
| up_axis | No | ||
| grid_pts | No | ||
| obj_path | Yes | ||
| work_dir | No | ||
| material_map | No | ||
| observer_pts | No | ||
| write_prefix | No | preview | |
| north_angle_deg | No | ||
| photosensor_pts | No | ||
| luminaire_groups | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses that it's diagnostic only, that material_map or sidecar is required, that layers left None are omitted, and that point layers can be .pts paths or inline rows. It does not mention potential side effects like file writes, but for a preview tool this is acceptable and the required precondition is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core purpose, then explains key parameters in compact phrasing. Every sentence adds value, and there is no fluff. It is appropriately sized for the complexity, though it could benefit from a clearer breakdown of parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters and 0% schema coverage, the description covers the most critical aspects: render modes, point layer formats, and the material_map/sidecar requirement. It leaves some parameters (units, north_angle_deg) unexplained, but the tool's core usage is clear. An agent can likely invoke it correctly for basic previews.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains render options, point layers (grid_pts, observer_pts, photosensor_pts), and the material_map/sidecar requirement. However, it does not explain units, up_axis, north_angle_deg, work_dir, write_prefix, or luminaire_groups, leaving those parameters ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb (preview) and resource (room with sensor overlays) and specifies the output (matplotlib PNG, plan + 3D). It also distinguishes itself from photometric renders by explicitly saying 'not a photometric render', which helps differentiate from rendering tools like run_image and run_grid.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use it: it's a diagnostic preview, not a final render, and it requires material_map OR sidecar. It does not name specific alternative tools, but the purpose is distinct enough and the 'not a photometric render' note implies it should not be used for final rendering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quality_presetsA
Ambient-quality presets: pick the accuracy/runtime trade-off up front, by name.
Radiance's ambient parameters govern the indirect (interreflected) solve, which dominates both
runtime and the accuracy of every climate-based metric. Passing no rad_params means
inheriting a preview-grade default by not choosing — which on a validated annual run returned
sDA 77.78% where a converged solve returned 100.00% on identical geometry.
Levels, cheapest first: low -ab 0 : geometry checks and direct-sun questions only. NO interreflection. medium -ab 2 : draft studies and design comparison. Preview-grade convergence. high -ab 3 : reportable results — DA/sDA/UDI, compliance. Use this to publish. extra_high -ab 5 : indirect-dominated scenes (light shelves, atria) and validation.
Call with no argument for the full table including each level's caveat; call with a level to
get just that one. Pass the level to a simulation tool as quality=, or its rad_params
string directly if you want to tune from it.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility, and it excels. It discloses that omitting 'rad_params' inherits a preview-grade default and quantifies the accuracy impact with a concrete example (sDA 77.78% vs 100%). It explains the behavior of calling with no argument versus a level, and it lists each level with its exact -ab value and caveats. No hidden behavior is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It front-loads the purpose, explains why ambient quality matters, lists levels with concise caveats, and ends with usage instructions. The structure is logical and scannable, with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers everything an agent needs: what the tool does, the trade-off it addresses, all valid inputs, the output behavior (table vs single level), and how to integrate with simulation tools. Given the tool's simplicity (one optional parameter) and the presence of an output schema, this is complete. The agent can confidently invoke it without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines a single optional 'level' parameter with no description or enum, so schema coverage is effectively 0%. The description fully compensates by enumerating the valid values (low, medium, high, extra_high) and explaining what each does. It also clarifies the null/omitted case, making the parameter's meaning completely clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise purpose: 'Ambient-quality presets: pick the accuracy/runtime trade-off up front, by name.' It clearly distinguishes this tool from siblings like 'presets' and 'list_presets' by focusing specifically on ambient-quality levels for Radiance. The description immediately tells the agent what the tool is for and what it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use each level: low for geometry checks, medium for drafts, high for reportable results, extra_high for validation. It also explains how to call it with or without an argument and how to pass the level to simulation tools. While it doesn't explicitly state alternatives, the level list and integration instructions provide complete context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
radiance_statusA
Report Radiance availability: {available, bin_dir, version, found, missing}.
Use this to check whether Radiance tools (run_grid, ...) will execute vs return commands.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It conveys that this is a read-only 'Report' operation, lists the availability-related fields, and explains the practical consequence of availability (execution vs returning commands). This is strong coverage for a simple status tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, and the core purpose is front-loaded. The first sentence states exactly what is reported; the second sentence gives the actionable use case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with an output schema, the description is complete. It tells the agent what the tool reports, why it matters, and how to interpret the result in relation to Radiance tool execution.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter burden for the description to carry. The baseline of 4 applies, and the description adds useful context by naming the output fields and their role.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report') and resource ('Radiance availability') and enumerates the exact fields included. It clearly distinguishes this from sibling tools like daysim_status by focusing on Radiance, and even references run_grid as an example.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: to check whether Radiance tools will execute or return commands. It gives clear context without naming an alternative tool, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_fixturesC
First-principles HCL fixture sizing: lumen-method visual flux reconciled with a CIE S 026 mel-DER circadian solve. Returns flux, count, layout, CCT band, energy, and explicit caveats. distribution: direct|direct_indirect|indirect. Deterministic - always runs. See operating-guide.md workflow F.
| Name | Required | Description | Default |
|---|---|---|---|
| width_m | Yes | ||
| height_m | Yes | ||
| length_m | Yes | ||
| rho_wall | No | ||
| rho_floor | No | ||
| rho_ceiling | No | ||
| distribution | No | direct | |
| eye_height_m | No | ||
| target_em_lux | No | ||
| mount_height_m | Yes | ||
| target_mel_edi | No | ||
| mel_edi_daylight | No | ||
| maintenance_factor | No | ||
| workplane_height_m | No | ||
| target_efficacy_lm_w | No | ||
| vertical_horizontal_ratio | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 does state that the tool is deterministic and always runs, and it lists the return items. However, it does not mention potential side effects, error conditions, or prerequisites (e.g., whether geometry must be imported first). This is partial but not comprehensive for a complex sizing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with three sentences that front-load the core purpose and then list outputs and a key parameter. It is well-structured and does not waste words, though the pointer to an external doc adds a minor dependency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (16 parameters, no annotations, no schema descriptions), the description is insufficient for an agent to call it correctly. It lacks parameter semantics, usage conditions, and behavioral details such as required inputs or error handling. The external reference to workflow F is not self-contained, and the agent would likely need to consult external docs to use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for its 16 parameters, so the description must compensate. It only explains the 'distribution' parameter (direct|direct_indirect|indirect) and hints at 'mel-DER circadian' relating to target_mel_edi. The vast majority of parameters (e.g., rho_wall, maintenance_factor, target_efficacy_lm_w) are not explained at all, leaving the agent to guess their meaning and units.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs fixture sizing using a combined lumen method and circadian solve, and lists the outputs (flux, count, layout, CCT band, energy, caveats). It is specific enough to distinguish from sibling tools like circadian_metrics or spd_to_channels, though it does not explicitly name an alternative. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives. The phrase 'See operating-guide.md workflow F' points to external documentation but does not describe conditions or trade-offs. The description does not mention when to use this over, say, presets or compliance, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconstruct_spectrumA
Reconstruct a 401-value 380-780 nm @1 nm per-nm spectrum from sky+sun channel sets (spec §5.2).
method: 'faithful' (flat §9.3a step-expansion + neutral sun -> reproduces the legacy 2.0 method) or 'reference' (reference-SPD-shaped sky + air-mass colored direct sun; re-integrates to the channel bin totals). sun_spectral: 'colored' (air-mass solar SPD by solar_zenith) | 'neutral' (flat). dseries_sky=True reconstructs a per-timestep CIE D-series sky from sky_cct. sun_spd: optional 401-value physical sun reference that overrides the air-mass template. Returns the spectrum + the flat-vs-reference and neutral-vs-colored-sun divergence (always surfaced).
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | reference | |
| sky_cct | No | ||
| sky_spd | No | ||
| sun_spd | No | ||
| dseries_sky | No | ||
| channel_type | No | ||
| sky_channels | Yes | ||
| solar_zenith | No | ||
| sun_channels | Yes | ||
| sun_spectral | No | colored |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It openly states the return value ('Returns the spectrum + the flat-vs-reference and neutral-vs-colored-sun divergence (always surfaced)') and explains key behavioral differences between methods and sun spectral models. It does not mention side effects or error conditions, but as a reconstruction tool it is likely read-only and the description sufficiently conveys its operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but well-structured with semicolons separating the method, sun_spectral, dseries_sky, sun_spd, and return behavior. It front-loads the core purpose and then details options. There is no fluff, but it is lengthy; still, every sentence contributes essential information for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 parameters, 2 required), the description covers the most decision-relevant parameters and the return contract. An output schema exists, which likely details the exact return structure, so the description need not repeat that. It omits a few parameters, but the essential information for selecting the method and understanding the output is present. Slight gaps remain for edge-case parameters like channel_type and solar_zenith, but overall it is sufficiently complete for an agent to call correctly in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the meaning of method, sun_spectral, dseries_sky (and its dependence on sky_cct), and sun_spd as an override. It does not explicitly cover sky_spd, channel_type, or solar_zenith, but these are either inferable from context or secondary. The description adds significant semantic value beyond the bare schema, though not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific action: 'Reconstruct a 401-value 380-780 nm @1 nm per-nm spectrum from sky+sun channel sets'. It clearly identifies the verb, the resource, and the source data, distinguishing it from sibling tools like spd_to_channels (conversion) or spectral_metrics (analysis). It also references the spec section, adding precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two methods ('faithful' reproduces legacy 2.0, 'reference' re-integrates to channel bin totals) and the sun_spectral options, giving clear context on what each does. However, it does not explicitly state when to prefer one over the other or exclude alternatives among siblings. There is no 'when not to use' guidance, but the tool's purpose is distinct enough that usage is largely self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
referenceB
Look up HCL reference content. topic: bins | coefficients | caveats | overview.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | overview |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states 'look up' implying a read operation, but does not disclose side effects, error behavior, or output format. The description is minimal and leaves the agent to infer safety and behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the purpose and lists the valid topics. It is concise and free of filler, though it could be slightly more structured with bullet points, but as a string it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, output schema exists), the description is fairly complete. It specifies the valid topics, and the output schema presumably defines the return structure. The main gap is the lack of guidance on edge cases or alternatives, but for a straightforward lookup this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 0%, the description compensates by enumerating the allowed values for 'topic' (bins | coefficients | caveats | overview), which is more informative than the schema's bare string type with a default. It tells the agent exactly what inputs are valid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (look up) and the resource (HCL reference content), and even lists specific topics (bins, coefficients, caveats, overview). It is specific and unambiguous, though it does not explicitly differentiate from the sibling 'get_reference', which might overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description implies that it is for retrieving HCL reference content, but does not mention when not to use it, prerequisites, or how it relates to siblings like 'get_reference' or 'list_presets'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_annualA
Annual 2-phase DDS HCL simulation (per channel) -> annual mel-EDI + circadian dosimetry.
channel_scenes: 1 dict (3ch) or 3 dicts (9ch), each {materials:[paths], geometry:path,
sky_color:[r,g,b]}. NOTE each dict's geometry is a SINGLE .rad path (geometry_set[i] from
import_geometry), not the whole geometry_set list.
points: inline [x,y,z,dx,dy,dz] rows OR a .pts path (inline rows are written to a .pts for you,
matching run_grid).
period: optional [[m,d,h],[m,d,h]] analysis window; when given, the .wea is subset to that
period before the run and real HOY drives dosimetry (omit to run the full year).
Runs Radiance if present, else returns the exact command sequence.
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| wea | Yes | ||
| period | No | ||
| points | Yes | ||
| quality | No | ||
| work_dir | No | ||
| rad_params | No | ||
| channel_type | No | ||
| timestep_min | No | ||
| channel_scenes | Yes | ||
| dosimetry_threshold | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: it runs Radiance if present, otherwise returns the exact command sequence; it automatically writes inline points to a .pts file; and it subsets the .wea when period is given. These are meaningful behavioral details beyond the schema, though it does not cover error handling or performance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a concise purpose line, then dedicated sections for channel_scenes, points, and period, followed by a single execution note. It is front-loaded with the purpose and packs significant detail without being verbose. The use of line breaks aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core inputs and the execution behavior, and references dependencies like import_geometry and run_grid. However, given the tool's complexity (11 params, simulation, no annotations), it omits explanations for several parameters and does not describe the output format, although an output schema exists. It is adequate but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It thoroughly explains channel_scenes (including the single-geometry note), points (inline vs .pts with auto-writing), and period (analysis window and subsetting). However, it leaves many other parameters (wea, run, quality, work_dir, rad_params, channel_type, timestep_min, dosimetry_threshold) undocumented, relying solely on their names. It covers the most complex required inputs but not all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line clearly states the tool's function: 'Annual 2-phase DDS HCL simulation (per channel) -> annual mel-EDI + circadian dosimetry.' This is a specific verb+resource combination that distinguishes it from siblings like run_grid or run_image, which likely focus on standard daylight or rendering. The description also clarifies the per-channel scope and output metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives such as run_grid or annual_daylight. It implies it is for HCL-specific annual simulation, but provides no exclusions or alternative routing. The final note about Radiance presence is behavioral, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_gridB
Point-in-time grid HCL metrics via Radiance (oconv -> rtrace -I per channel -> recombine).
scene_sets: 1 list of .rad paths for 3-channel, or 3 lists (blue/green/red bin sets) for 9-channel. points: rows [x,y,z,dx,dy,dz] or a .pts path. Runs Radiance if present, else returns the commands. export_csv: optional path (abs or relative to work_dir) to dump the per-point result table.
sky_files: which scene paths are sky, listed exactly as they appear in scene_sets. Only matters
with electric_lights, which builds a sky-free octree for the electric block. Left unset, the
sky is DETECTED (gensky/gendaylit primitives, skyfunc, the sky/ground hemispheres, plus a
basename hint), which covers the generators this codebase and Radiance use but cannot cover a
hand-rolled sky using none of them. Pass it explicitly for an unusual scene — in both
directions: to name a sky nothing would detect, or to KEEP a sky-looking file (exterior context)
inside the electric octree. A leak here reports daylight as electric light; the electric block
carries a lumen_bound (sum of luminaire lumens / grid area) so an over-count is visible.
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| points | Yes | ||
| quality | No | ||
| work_dir | No | ||
| sky_files | No | ||
| export_csv | No | ||
| rad_params | No | ||
| scene_sets | Yes | ||
| channel_type | No | ||
| electric_lights | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it delivers substantial context: it discloses the fallback ('Runs Radiance if present, else returns the commands'), the sky-detection heuristic (gensky/gendaylit primitives, skyfunc, hemispheres, basename hint), and even the failure consequence ('A leak here reports daylight as electric light... so an over-count is visible'). This is genuinely useful behavioral disclosure beyond the schema. It falls short of 5 only because it never addresses side effects such as file/octree writes or work_dir mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and uses parameter names as scannable markers, which is good structure. However, the sky_files paragraph is a dense wall of conditional logic that runs several sentences without a break, making it hard to parse. For a tool this complex some length is justified, but the text is not concise and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, 0% schema coverage, and an output schema that covers return values, the description handles the hardest parameter (sky_files) extremely well but leaves run, quality, rad_params, and channel_type entirely undocumented. With no annotations and zero schema coverage, that is a real completeness gap — an agent cannot correctly configure those parameters from this description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for some parameters: scene_sets (1 list vs 3 lists for 3/9-channel), points (row format [x,y,z,dx,dy,dz] or .pts path), export_csv (abs or relative path), and sky_files (detailed semantics tied to electric_lights). But roughly half the parameters — run, quality, rad_params, channel_type, and electric_lights' own semantics — receive no explanation at all. Partial compensation for a large 10-parameter surface.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, informative statement: 'Point-in-time grid HCL metrics via Radiance (oconv -> rtrace -I per channel -> recombine)'. This names a clear verb+resource and even spells out the pipeline, which implicitly distinguishes it from siblings like run_annual and run_image. It is not a tautology and not vague, though it never explicitly names a sibling for contrast, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over alternatives such as run_annual, daylight_factor, or run_image. The description explains mechanics (how Radiance is invoked, fallback behavior) but never states the use-case boundary or exclusions. An agent gets no help deciding whether point-in-time HCL grid metrics is the right call versus an annual or imaging sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_imageC
Fisheye HCL image workflow: rpict -> mel/neuropic greyscale luminance maps (falsecolor-ready) -> optional ipRGC FOV weighting -> RGB-from-HDR eye irradiance. Runs Radiance if present, else returns the commands.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| run | No | ||
| view | No | -vta -vh 180 -vv 180 | |
| glare | No | ||
| quality | No | ||
| mask_dir | No | ||
| work_dir | No | ||
| rad_params | No | ||
| scene_sets | Yes | ||
| channel_type | No | ||
| glare_params | No | ||
| fov_weighting | No | ||
| electric_lights | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral trait: 'Runs Radiance if present, else returns the commands.' This is valuable because it tells the agent the tool may not execute but instead return shell commands. With no annotations provided, the description carries the full burden, yet it omits details about side effects, file modifications, or error handling. It adds some transparency but is far from comprehensive for a 14-parameter tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence that front-loads the purpose and then lists the pipeline steps. It is concise and avoids unnecessary fluff. However, the jargon-laden pipeline could benefit from a bit more clarity, and the sentence structure is a run-on with multiple dashes, but it remains efficient and reasonably structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (14 parameters, no annotations, and an output schema that we cannot see), the description is severely inadequate. It does not explain how to invoke the tool, what each parameter does, or what constitutes a successful call. An agent would be unable to correctly use this tool based solely on the description, making it contextually incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides zero explanation of any of the 14 parameters. It doesn't mention scene_sets, view, quality, fov_weighting, or any other parameter, leaving the agent completely in the dark about how to configure the tool. The description must compensate for the lack of schema documentation, and it fails entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: a fisheye HCL image workflow, and enumerates the pipeline steps (rpict, luminance maps, ipRGC weighting, RGB-from-HDR). This distinguishes it from sibling tools like run_grid or run_annual which target different rendering tasks. However, it doesn't explicitly name the resource as 'run_image' or contrast with specific siblings, so it's not a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. The description mentions 'Fisheye HCL' which implies a scenario, but it doesn't explicitly state 'use this for fisheye images' or 'use run_grid for workplane grids.' There is no mention of exclusions or prerequisites, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_validationB
Run the built-in correctness self-test (weight sums, alpha-opic guards).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It states the action ('Run') and the subject (self-test), but does not reveal whether it has side effects, whether it is read-only, what happens on failure, or what the output means. The output schema exists but is not referenced; the description adds minimal behavioral context beyond the obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that conveys the action and scope without waste. It is highly concise and well-structured for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter self-test tool with an output schema, the description is minimally adequate. It states what the tool does but omits when to use it, what constitutes a successful run, and how to interpret results. The presence of an output schema covers return values, but the lack of usage context and behavioral details leaves the description incomplete for an agent unfamiliar with the domain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is trivially 100%. Per calibration, a baseline of 4 is appropriate since there are no parameters to explain. The description correctly adds nothing about parameters, as there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Run') and resource ('built-in correctness self-test'), and gives concrete examples of what it checks (weight sums, alpha-opic guards). This is sufficiently distinct from sibling tools like 'validate' and 'compliance', though it doesn't explicitly differentiate itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It doesn't mention conditions for use, exclusions, or why an agent would prefer this over 'validate' or 'compliance'. The usage context is only implied by the self-test description, leaving an agent to guess when this is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_briefA
Persist (shallow-merge) a study brief to //brief.json. Call after each phase.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | ||
| study | Yes | ||
| work_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It does disclose the shallow-merge behavior and the exact write location, which adds value beyond the schema. However, it omits details like directory creation, error handling, or what happens if the file exists, which are relevant for a persistence tool without annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core action and purpose. It is concise, with no wasted words, and directly communicates the key information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters, no annotations, and an output schema (not visible), the description is adequate but not exhaustive. It covers when to call it and what it does, but leaves out parameter semantics and edge-case behavior. The presence of an output schema might reduce the need to describe return values, but given the minimal parameter explanation, the overall context is only moderately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It implies the parameters via the path template (<work_dir>/<study>/brief.json) but does not explicitly explain the 'brief' object structure or the optional nature of work_dir. The path gives partial meaning, but leaves the agent guessing about parameter content and defaults, which is insufficient for 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (persist/shallow-merge) and the target resource (<work_dir>/<study>/brief.json). It distinguishes from siblings like load_brief by specifying the save operation and the file path, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs 'Call after each phase', providing clear when-to-use context. However, it does not mention alternatives or when not to use it, which would make it a 5. The sibling list includes load_brief, but no explicit comparison is made.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sensorsA
Manage named, persistent daylight sensor sets (reused across annual_daylight / daylight_factor / daylight_savings via sensor_set='name').
action: 'create' | 'list' | 'get' | 'delete'. create: name + (points=[[x,y,z,dx,dy,dz],...] OR grid={interior:[xmin,xmax,ymin,ymax], floor_z, workplane_h?, max_spacing?}); overwrite=True to replace an existing set. list: all saved sets (name, path, count, source). get: name -> the set's points + .pts path. delete: name -> remove the set.
| Name | Required | Description | Default |
|---|---|---|---|
| grid | No | ||
| name | No | ||
| action | Yes | ||
| points | No | ||
| work_dir | No | ||
| overwrite | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it explains overwrite semantics, delete removes the set, and get returns points plus the .pts path. It doesn't cover error cases or side effects beyond overwrite, but core behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a clear purpose line and a bulleted action list. It front-loads the core concept and each action is described succinctly. Slightly dense but efficient, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, 4 actions) and no annotations, the description is reasonably complete. It details points and grid structures, overwrite behavior, and return expectations for get and list. It doesn't specify return values for create/delete, but an output schema exists, which may cover that. Overall, sufficient for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description is the sole documentation for parameters. It explains the points array format, grid object structure, and overwrite flag. Work_dir is not described, but it is a common auxiliary parameter. The description compensates well for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages named, persistent daylight sensor sets, listing four concrete actions (create, list, get, delete). It distinguishes itself by noting these sets are reused by other tools via sensor_set='name', making the resource and scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (when managing sensor sets for daylight simulations) but does not explicitly contrast with siblings like workplane_grid or observer_points. However, the CRUD nature and mention of reuse across specific tools provide adequate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spd_to_channelsA
Average a spectral power distribution into the 3- or 9-channel bins.
spd: a .spd file path, 2-column text, or list of [wavelength, value]. channel_type: 0=3ch [r,g,b], 1=9ch [b1..r3].
The str|list annotation is load-bearing: an untyped arg makes FastMCP stringify a list-of-pairs
over the wire, which parse_spd then mis-reads as 2-column text (DEF-1/DEF-2 class).
| Name | Required | Description | Default |
|---|---|---|---|
| spd | Yes | ||
| channel_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no MCP annotations present, the description carries the full behavioral burden. It discloses input flexibility and, importantly, the FastMCP serialization failure mode for untyped list arguments, which is a non-obvious trap. It does not mention side effects, but this is a pure computation and the output schema covers return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by terse parameter definitions and a single necessary warning. Every sentence earns its place, including the serialization warning, which is technical but valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter pure computation with an output schema, the description is complete: all inputs are explained, the channel layouts are specified, and the wire-format pitfall is flagged. No critical calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description fully defines both parameters: spd accepts a .spd path, 2-column text, or list of [wavelength, value], and channel_type maps 0 to 3ch [r,g,b] and 1 to 9ch [b1..r3]. This completely compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and object: 'Average a spectral power distribution into the 3- or 9-channel bins.' This clearly identifies the transformation and the two possible output resolutions, distinguishing it from sibling spectrum tools without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the averaging operation and the parameter explanations, but the description does not explicitly state when to choose this tool over alternatives or provide exclusion conditions. There is no direct sibling differentiation or 'use this when' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spectral_epwA
Emit spectral-sky artifacts from an EPW over the year (or hours). LONG-RUNNING for a full year.
forms ⊆ {spd_set, band_matrix, spectral_wea, sidecar} (default all). Writes into work_dir and
returns {files: {form: path}, n_records}. hours is a list of [month, day, hour] to subset.
engine: spectrl2 (default) | smarts (requires SMARTSPATH).
Opt-in refinements (defaults reproduce prior output): ozone_mode='climatology' computes ozone from the EPW LOCATION lat/lon + date (van Heuklon 1979); aerosol_g overrides the 0.65 asymmetry; aod_anchor_nm converts a declared-wavelength AOD (e.g. 550) to tau500 via the Angstrom exponent. smarts_aerosol (engine="smarts" only): None/"rural" (default) or "user" to make the Ångström exponent + asymmetry factor settable via the SMARTS Card 8 USER aerosol model. cloud_variant: which SEDES1 cloud CCM to apply to the sky-diffuse spectrum — 'reanchored' (default, byte-identical to omitting this arg) | 'verbatim' (faithful Fig.11 CCM) | 'seed' (legacy eyeballed 9-anchor seed) | 'local' (your own locally-fitted CCM, requires ccm_coeffs). ccm_coeffs: path to a fitted CCM CSV (from sedes1_fit) — required when cloud_variant='local'.
| Name | Required | Description | Default |
|---|---|---|---|
| epw | Yes | ||
| forms | No | ||
| hours | No | ||
| engine | No | spectrl2 | |
| work_dir | No | ||
| aerosol_g | No | ||
| ccm_coeffs | No | ||
| ozone_mode | No | ||
| aod_anchor_nm | No | ||
| cloud_variant | No | ||
| smarts_aerosol | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It discloses that the tool is long-running for a full year, writes to work_dir, returns a structured output, and that certain defaults reproduce prior output. It also flags engine-specific requirements (e.g., SMARTSPATH for smarts) and dependency on ccm_coeffs for 'local' cloud variant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured, using a top-line purpose statement followed by detailed parameter explanations separated by line breaks. Every sentence provides essential information without redundancy, and the main purpose is front-loaded before the parameter details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters, output schema present), the description is remarkably complete. It covers the purpose, output format, parameter semantics, dependencies, defaults, and variations. There are no obvious gaps that would prevent an agent from calling the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all parameters. It does so comprehensively: forms, hours, engine, work_dir, ozone_mode, aerosol_g, aod_anchor_nm, smarts_aerosol, cloud_variant, and ccm_coeffs are all explicitly defined with their semantics and defaults. This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('emit') and resource ('spectral-sky artifacts from an EPW'), with explicit mention of forms and the annual/hourly scope. It differentiates from sibling tools like spectral_sky_from_epw by focusing on emitting artifacts and the option set, so an agent can infer its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context about long-running behavior and various configuration options, but it does not explicitly state when to use this tool versus alternatives like spectral_sky_from_epw or atmosphere_from_epw. The intended usage is implied by the tool's purpose rather than explicitly contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spectral_metricsA
Derived HCL quantities from an SPD: cct/duv, mel-DER, mel/photopic ratio, and EML<->EDI.
spd accepts a .spd file path, 2-column text, or a list of [wavelength, value].
The two modes below are mutually exclusive, so the eml_edi key has a DIFFERENT shape in each:
spd= -> {cct_duv, mel_der, mel_photopic_ratio, eml_edi:{mel_edi, eml}}. Here
eml_ediis the SPD's melanopic EDI + its EML equivalent. NOTE: theeml_ediblock is ABSOLUTE/scale-dependent (see itsscale_note); the other metrics are scale-invariant.metric('all' | one key) selects a single block.eml_edi_value= -> scalar EML<->mel-EDI conversion only (no SPD needed): {eml_edi:{input, direction, result}}. eml_edi_direction= 'medi_to_eml' (default) or 'eml_to_medi'. (Spec 7.1 row 5 EML<->EDI.)
| Name | Required | Description | Default |
|---|---|---|---|
| spd | No | ||
| metric | No | all | |
| eml_edi_value | No | ||
| eml_edi_direction | No | medi_to_eml |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the eml_edi block is absolute/scale-dependent and includes a scale_note, while other metrics are scale-invariant. It also notes the output shape differs by mode and that metric selects a single block. This is meaningful behavioral context beyond just 'compute'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with bullets and indentation, front-loading the purpose and then detailing modes. It is somewhat dense but every sentence earns its place, providing necessary detail without excessive verbosity. The organization aids scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite complexity (two modes, varying output shapes, scale-dependence), the description covers everything an agent needs: input formats, output structures, parameter defaults, and important caveats. With an output schema present, the description still provides the behavioral context needed for correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates. It explains spd accepts a file path, 2-column text, or a list; eml_edi_value is a scalar; eml_edi_direction has two allowed values; and metric selects 'all' or one key. It also clarifies the mutual exclusivity and how parameters interplay, which is essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes specific HCL quantities from an SPD, listing cct/duv, mel-DER, mel/photopic ratio, and EML<->EDI. It also distinguishes two mutually exclusive modes, giving the agent a precise understanding of the tool's function and output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use each mode (spd= for full metrics, eml_edi_value= for scalar conversion) and notes the default direction for eml_edi_direction. It does not explicitly compare to sibling tools like circadian_metrics, but the usage context is clear enough for an 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.
spectral_sky_from_epwA
Physical spectral sky (1nm direct + sky-diffuse) reconstructed from an EPW hour.
Returns the canonical record as a dict. If surface_tilt_deg is given, also returns the spectral ground-glow term for that receiver tilt. spectral_albedo (len 401, 380-780nm @1nm) overrides the default gray albedo — pass import_geometry(...)["ground_albedo"] to couple scene ground reflectance to the sky ground-glow term. engine: spectrl2 (default) | smarts (requires SMARTSPATH).
Opt-in refinements (defaults reproduce prior output): ozone_mode='climatology' computes ozone from the EPW LOCATION lat/lon + date (van Heuklon 1979); aerosol_g overrides the 0.65 asymmetry; aod_anchor_nm converts a declared-wavelength AOD (e.g. 550) to tau500 via the Angstrom exponent. smarts_aerosol (engine="smarts" only): None/"rural" (default) or "user" to make the Ångström exponent + asymmetry factor settable via the SMARTS Card 8 USER aerosol model. cloud_variant: which SEDES1 cloud CCM to apply to the sky-diffuse spectrum — 'reanchored' (default, byte-identical to omitting this arg) | 'verbatim' (faithful Fig.11 CCM) | 'seed' (legacy eyeballed 9-anchor seed) | 'local' (your own locally-fitted CCM, requires ccm_coeffs). ccm_coeffs: path to a fitted CCM CSV (from sedes1_fit) — required when cloud_variant='local'.
| Name | Required | Description | Default |
|---|---|---|---|
| day | Yes | ||
| epw | Yes | ||
| hour | Yes | ||
| month | Yes | ||
| engine | No | spectrl2 | |
| aerosol_g | No | ||
| overrides | No | ||
| ccm_coeffs | No | ||
| ozone_mode | No | ||
| aod_anchor_nm | No | ||
| cloud_variant | No | ||
| smarts_aerosol | No | ||
| spectral_albedo | No | ||
| surface_tilt_deg | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses the return type, the conditional ground-glow term, default behaviors (defaults reproduce prior output), engine-specific requirements (SMARTS needs SMARTSPATH), and details for each cloud_variant. This is comprehensive for a 14-parameter tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense yet well-structured, front-loading the main purpose and then grouping refinements logically. Every sentence adds value; the length is justified by the tool's complexity. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists (not shown), so return values need no further detail. The description explains coupling with import_geometry, engine requirements, and all major parameters. For a 14-parameter tool with no annotations, this is exceptionally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description must explain parameters, and it explains most (spectral_albedo length/range, ozone_mode, aerosol_g, aod_anchor_nm, smarts_aerosol, cloud_variant, ccm_coeffs). However, 'overrides' is left entirely unexplained, and surface_tilt_deg is only described behaviorally without syntax details. Still, the coverage is strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb ('reconstructed') and resource ('physical spectral sky from an EPW hour'), and specifies the output ('canonical record as a dict'). It distinguishes itself from siblings like spectral_sky_native and reconstruct_spectrum by describing its inputs and the physics model used.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides detailed guidance on when to use each optional parameter (e.g., ozone_mode for climatology, cloud_variant variants, engine selection, coupling with import_geometry). It does not explicitly compare against alternative sky tools (e.g., spectral_sky_native) or state when not to use this tool, but the parameter-level guidance is substantial and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spectral_sky_nativeA
Native Radiance 6.x spectral sky from an EPW via gensdaymtx (20-band W/sr/m² matrix).
mode: all | sun (-d) | sky (-s). Degrades to emitting the gensdaymtx + rcomb command plan when
Radiance 6.x isn't installed. The melanopic collapse is rcomb -c M.
timeout caps the gensdaymtx subprocess in seconds (default None = no cap). gensdaymtx ALWAYS
processes every EPW hour. A full 8760-hour year at mf=1 is fast (~12 s on Radiance 6.1a), but cost
grows steeply with the Reinhart subdivision mf (minutes at mf>=4); on expiry the tool returns
{ok: False, timed_out: True} rather than raising. Trim the EPW, or raise mf only as needed.
| Name | Required | Description | Default |
|---|---|---|---|
| mf | No | ||
| epw | Yes | ||
| run | No | ||
| mode | No | all | |
| timeout | No | ||
| work_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 covers several important behaviors: the subprocess invocation (gensdaymtx), the degradation to a command plan if Radiance 6.x is missing, the timeout behavior and its default, the fact that gensdaymtx always processes every EPW hour, performance scaling with mf, and the error return on timeout ({ok: False, timed_out: True}) instead of raising. This is thorough, though it does not mention side effects like file writing (work_dir) or the output format beyond the matrix specification, which is partially covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and efficient, with no fluff. The main purpose is front-loaded, followed by mode, fallback, timeout, performance, and error handling. Each sentence contributes unique information, and the technical details are relevant. It is slightly dense but not overly long, making it easy to scan for key facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description does not need to explain return values, and it does not. It covers prerequisites (Radiance 6.x), fallback behavior, performance characteristics, timeout handling, and parameter semantics. It does not explain what the matrix output is used for or how to interpret the melanopic collapse, but these are likely domain-specific and may not be necessary for tool selection. Overall, it is complete for an expert user and sufficiently guides the agent on behavior and limitations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate for parameter meaning. It explains mode with its possible values, timeout with its default and effect, and mf with its performance implications ('cost grows steeply... Trim the EPW, or raise mf only as needed'). It also implies epw's role ('from an EPW'). However, it does not describe the 'run' or 'work_dir' parameters, though these are relatively self-explanatory. Overall, it adds significant meaning for the most important parameters, but not all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: generating a native Radiance 6.x spectral sky from an EPW file using gensdaymtx, and specifies the output as a 20-band W/sr/m² matrix. It is specific about the verb (generate), resource (spectral sky), and method, but it does not explicitly contrast with sibling tools like spectral_sky_from_epw, leaving differentiation to the word 'Native' and the technical details. The description is clear enough for an agent to understand what it does, but lacks explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions the mode parameter ('all | sun (-d) | sky (-s)') but does not explain when to use this tool versus alternatives like spectral_sky_from_epw or colored_sky. It only describes a fallback when Radiance 6.x is not installed, which is a condition, not usage guidance. There is no explicit statement about when to prefer this tool over siblings or when not to use it, leaving the agent to infer from the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateB
Run the built-in correctness self-test (weight sums, alpha-opic guards).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It says it runs a self-test but does not indicate whether it is read-only, what the output looks like, whether it performs any side effects, or what 'correctness' entails beyond vague hints. This is insufficient for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, concise sentence that front-loads the verb and resource, with no wasted words. The parenthetical clarification about what the self-test checks adds useful context without bloating the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with no parameters, and an output schema exists, so the description doesn't need to explain return values. However, it lacks any usage context, such as when this self-test should be run relative to other tools, and it doesn't clarify whether this is a safe read-only operation. Given the simplicity, the description is minimally adequate but leaves gaps in guidance and behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds no parameter-specific details because there are none to add; the schema is empty and the description doesn't need to compensate for anything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Run') on a specific resource ('built-in correctness self-test') and gives a hint of scope ('weight sums, alpha-opic guards'). However, it does not explicitly differentiate from the sibling tool 'run_validation', which could be confused with this. The purpose is clear but not fully distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no mention of prerequisites, and no exclusions. The description simply states what it does without context for selection. With sibling tools like 'run_validation' present, the lack of routing guidance is a notable gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
weatherB
Ingest a .wea (DNI/DHI per timestamp) and/or decompose an analysis period into HOY + wea line numbers.
Returns wea_summary (record count, first/last timestamp, DNI/DHI ranges) rather than the full
per-hour arrays — those reach up to 8760 rows and overflow the response budget. Use period +
subset_out to get the rows you actually need (HOY/wea_lines in decomposed, the subset .wea on disk).
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | ||
| wea_path | No | ||
| subset_out | No | ||
| timestep_min | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits, and it does a solid job. It explicitly states that the tool returns a summary rather than full arrays to avoid response overflow, and it explains how to get the needed rows via period and subset_out. It does not mention potential side effects (like writing a subset .wea to disk) or error conditions, but the core behavior is transparent enough for an agent to anticipate the response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two sentences, with the primary purpose front-loaded. The second sentence explains the output limitation and offers a solution, which is directly actionable. No filler or redundancy; each sentence contributes meaningfully to the agent's understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are documented, but the description adds value by explaining the summary vs full arrays and the overflow concern. However, it leaves timestep_min unexplained and does not cover potential edge cases or requirements (e.g., file existence, permissions). Given the tool's moderate complexity and lack of parameter descriptions, the description is not fully complete but covers the key points adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides zero descriptions for its parameters, so the description must compensate. It explains period and subset_out explicitly, and wea_path is implied by 'Ingest a .wea', but timestep_min is entirely unmentioned. Since two of four parameters are not adequately described, the agent cannot fully understand how to use the tool correctly, especially for the timestep_min parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's actions: ingest a .wea file and/or decompose an analysis period into HOY and wea line numbers. It also specifies the resource (.wea file) and the output (summary vs full arrays), which helps an agent understand the core function. However, it does not explicitly differentiate from siblings like import_weather or generate_subhourly_wea, so it falls short of a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to choose this tool over its siblings. It does hint at using period and subset_out to obtain specific rows, but that is parameter usage, not tool selection. There is no mention of alternatives or conditions under which this tool is preferred, leaving the agent to infer usage from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workplane_gridA
EN 12464-1 working-plane illuminance grid from an OBJ room.
Interior extent via inner-surface detection (bbox of inward-facing vertical wall faces), plane at floor-top + workplane_h, max spacing p=0.2*5^log10(d) with d=the larger dimension of the calculation area (the interior inset by border_offset, per EN 12464-1 -- not the raw interior extent), cell-centre points. Returns points [x,y,z,0,0,1] + a methodology breakdown; writes a .pts (write_pts=None to skip). material_map OR sidecar is required (to identify floor & walls). clip_to_footprint (default True) drops lattice cells outside the floor slab for non-rectangular rooms (ignored when interior_extent is supplied explicitly); footprint_border insets the kept region from the footprint edges.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | ||
| sidecar | No | ||
| up_axis | No | ||
| obj_path | Yes | ||
| work_dir | No | ||
| write_pts | No | grid.pts | |
| max_spacing | No | ||
| workplane_h | No | ||
| material_map | No | ||
| border_offset | No | ||
| wall_thickness | No | ||
| interior_extent | No | ||
| north_angle_deg | No | ||
| footprint_border | No | ||
| clip_to_footprint | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosure. It reveals the computation method (inner-surface detection, plane at floor-top + workplane_h, spacing formula), the return format (points with direction [0,0,1] plus methodology breakdown), file writing behavior (write_pts=None to skip), and edge cases (clip_to_footprint ignored when interior_extent supplied). This is thorough and transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences pack in a lot of information without fluff. The purpose is front-loaded, followed by method and parameter specifics. While not overly verbose, it could be slightly more structured with bullet points for easier scanning, but it is appropriately concise given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters and 0% schema coverage, the description covers the most critical ones but leaves several undocumented (units, up_axis, wall_thickness, north_angle_deg, work_dir, max_spacing). An output schema exists, so return values are covered, and the methodology is well explained. However, the parameter coverage gap makes it only moderately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains workplane_h, border_offset, write_pts, material_map, sidecar, clip_to_footprint, footprint_border, and interior_extent, but leaves units, up_axis, wall_thickness, north_angle_deg, work_dir, and max_spacing (beyond the formula) unexplained. It adds meaning for the core parameters but not all 15.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'EN 12464-1 working-plane illuminance grid from an OBJ room.' This clearly defines the tool's purpose and distinguishes it from sibling tools like run_grid or run_image by its focus on a compliance grid for a specific standard.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context (EN 12464-1, working-plane) and prerequisites (material_map or sidecar required). It also explains parameter behaviors like clip_to_footprint and its interaction with interior_extent. However, it does not explicitly name alternatives or state when not to use it, though the purpose itself implies the usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_materialC
Write Radiance material .rad file(s). material_type 0=glass,1=plastic. Honors client roots for work_dir.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| channels | Yes | ||
| work_dir | No | ||
| roughness | No | ||
| specularity | No | ||
| channel_type | Yes | ||
| material_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does disclose that work_dir honors client roots, which is a useful behavioral trait. However, it does not mention whether files are overwritten, permissions required, or what happens on error. For a write operation, this is a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the main purpose. However, it is under-specified; while it has no wasted words, it omits critical details. It is not verbose but also not appropriately concise for a tool with seven parameters and zero schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters, no schema descriptions, no annotations, and only a brief description, it is far from complete. The agent would need to infer the meaning of 'channels' and 'channel_type' and the expected file format, which are not explained. This is a significant gap for a write operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only explains material_type (0=glass,1=plastic). The other six parameters (channels, channel_type, roughness, specularity, name, work_dir) are not explained at all, leaving the agent to guess their meaning from names alone. This is minimal added value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (write) and resource (Radiance material .rad file(s)), and gives a specific mapping for material_type (0=glass, 1=plastic). It is specific enough to distinguish from many siblings, though it does not explicitly name alternatives. It is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description simply states what it does, leaving the agent to infer context from the name and sibling list. There is no mention of prerequisites, typical use cases, or exclusions.
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.
51 tool updates
v0.1.0- First observed
alpha_opic - First observed
annual_daylight - First observed
annual_nvrd - First observed
atmosphere_from_epw - First observed
build_daysim - First observed
build_report - First observed
check_geometry - First observed
circadian_metrics - First observed
colored_luminaire - First observed
colored_sky - First observed
compliance - First observed
daylight_factor - First observed
daylight_savings - First observed
daysim_status - First observed
generate_subhourly_wea - First observed
get_reference - First observed
glare_ugr - First observed
glass_transmissivity - First observed
ies_analyze - First observed
ies_to_radiance - First observed
import_geometry - First observed
import_weather - First observed
lighting_controls - First observed
list_presets - First observed
lm83_daylight - First observed
load_brief - First observed
nvrd - First observed
observer_points - First observed
photosensors - First observed
presets - First observed
preview_scene - First observed
quality_presets - First observed
radiance_status - First observed
recommend_fixtures - First observed
reconstruct_spectrum - First observed
reference - First observed
run_annual - First observed
run_grid - First observed
run_image - First observed
run_validation - First observed
save_brief - First observed
sensors - First observed
spd_to_channels - First observed
spectral_epw - First observed
spectral_metrics - First observed
spectral_sky_from_epw - First observed
spectral_sky_native - First observed
validate - First observed
weather - First observed
workplane_grid - First observed
write_material
TDQS
Scored across 51 tools
There are at least four exact duplicate pairs (validate/run_validation, presets/list_presets, reference/get_reference, weather/import_weather), and many simulation/sensor tools overlap heavily (run_annual vs annual_daylight vs lm83_daylight vs annual_nvrd; run_grid vs daylight_factor). An agent cannot reliably distinguish which tool to call.
Most names are readable snake_case, but the set mixes verb_noun (run_grid, import_geometry), noun_verb (glass_transmissivity, workplane_grid), and bare-noun tools (sensors, presets, reference, weather). The duplicate pairs use different conventions for the same function, so no predictable pattern emerges.
51 tools is far beyond the calibration threshold for a well-scoped server, and many are near-duplicates or aliases that inflate the surface without adding capability. This is an extreme mismatch between the number of tools and what a coherent HCL server needs.
The domain surface is genuinely broad: geometry import/health/sensors, sky/weather spectral reconstruction, annual/daylight/glare/circadian simulations, compliance, controls, and reporting are all present. Minor gaps exist (e.g. non-conformant LM-83 method, unsupported UL 24480, no Radiance install path), but agents can work around them.
Maintenance
Related MCP Connectors
AI-powered life cycle assessment and modelling: connect to LCA databases, build and analyze systems
Design, solve and simulate HVAC systems from real components, weather years and buildings.
EPW/DDY weather files - TMY/AMY/CMIP6 morphing, UHI, events, smoke. 3 of 4 tools anon-free.
Natural-language queries over a verified emissions knowledge graph, plus standards validation
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to interact with OpenStudio building energy models through natural language, allowing users to load, inspect, and manipulate OSM files including building geometry, HVAC systems, materials, schedules, and internal loads.11MIT
- AlicenseAqualityAmaintenanceEnables natural-language interaction with Ladybug Tools for building performance simulation, 3D modeling, and data visualization, allowing agents to perform complex environmental analysis tasks without CAD software.310GPL 3.0
- AlicenseNot gradedqualityFmaintenanceWeather files (EPW/DDY) for building energy simulation, on-demand. Four tools: search the 17,000-station catalog, analyze any EPW (design conditions, HDD/CDD, DesignDay IDF emit), render 5 chart types (diurnal, wind rose, temp carpet, monthly box plot, comparison), and generate TMY/AMY/CMIP6-morphed scenarios with UHI, extreme events, and wildfire smoke overlays. 3 of 4 tools work without API key.MIT
- FlicenseNot gradedqualityAmaintenanceEnables natural language interaction with OpenStudio building energy simulation, allowing creation, querying, and modification of models, running EnergyPlus simulations, and analyzing results.44-