s2docs MCP Server
Provides verified reference data for Counter-Strike 2 (and its cs_script API), letting agents look up and search console variables/commands, Hammer entity keyvalues, inputs and outputs, schema classes and enums, game events, Pulse bindings, official Valve declarations and sample scripts so they can write cs_script, Hammer logic, configs and mods using real names.
Serves searchable documentation extracted from Valve's Source 2 game builds, exposing Valve-authored assets (point_script.d.ts, Hammer FGD classes, sample scripts, game events) as MCP tools, prompts and resources for building game logic, configs and mods for Valve's Source 2 titles.
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., "@s2docs MCP Serverlist the Hammer inputs for func_button in CS2"
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.
s2docs — Source 2 API/CLI docs + MCP
One searchable place for the undocumented surface of Valve's Source 2 games (Counter-Strike 2, Deadlock). Everything is extracted from each game build, then served three ways:
Web UI: a light vanilla-JS SPA for browsing and searching, plus operations pages (Hosts, Activity) for watching tests on remote hosts without SSHing anywhere, and an Orchestration page for the server's multi-step plans.
JSON API: FastAPI, with OpenAPI docs at
/docs.MCP server: tools, prompts and resources so coding agents can write cs_script, Hammer logic, configs and mods using verified names.
Data | CS2 | Deadlock | Source |
Console variables / commands | 4,327 / 1,246 | 4,859 / 1,421 |
|
Hammer entities (keyvalues, inputs, outputs) | 857 | 2,181 |
|
Schema classes / enums (fields, metadata, inheritance) | 3,753 / 634 | 9,264 / 880 |
|
Game events | 273 | 196 |
|
Pulse bindings | 2,488 | 2,646 |
|
cs_script API symbols | 517 | — |
|
Valve Hammer FGD classes (labels, help, defaults, choices) | 430 (63 editor-only) | — |
|
Valve sample scripts | 7 | — |
|
Community docs | 185 pages (all games) | source2.wiki (CC BY-SA 4.0) |
Where the data comes from
Source | Authored by | How we get it |
| Valve, copied verbatim from the game install | SteamTracking GameTracking mirrors the files on every patch |
Convars/commands, runtime entity lists, schema, Pulse bindings | Valve's binaries, extracted with DumpSource2 | Same GameTracking repos ( |
Wiki pages | source2.wiki community, CC BY-SA 4.0 | Shallow, sparse git clone of Source2Wiki/Source2Wiki |
No game install is needed. Entity lookups merge both entity sources. Every member is tagged runtime (registered by the binary), valve_fgd (an editor-only key from Valve's FGD) or both. The Valve Developer Community wiki is not ingested: it sits behind an anti-bot proof-of-work wall (Anubis) that deliberately blocks scripted clients. See RESEARCH.md for the full source survey.
Quick start
uv sync
uv run s2docs sync # sparse-clone GameTracking (~25 MB/game) and build data/s2docs.db (~5 s)
uv run s2docs serve # http://127.0.0.1:8000 (UI) · /docs (OpenAPI) · /mcp (MCP over HTTP)Other commands:
uv run s2docs sync --game cs2 # one game
uv run s2docs sync --no-fetch # re-index the existing checkout (e.g. after parser changes)
uv run s2docs sync --docs-only # only refresh source2.wiki (--skip-docs to skip it)
uv run s2docs load cs2 /path/to/GameTracking-CS2 # index a full local clone
uv run s2docs stats
uv run s2docs prompt cs2_script task="teleport players who touch the lava"
uv run s2docs mcp # MCP over stdioEnvironment variables
Variable | Default | Purpose |
| the checkout's | Directory holding the index, workspace and captured logs. Never relative to the cwd (see below). |
|
| The SQLite index file. |
|
| Local addon sources written by the build tools. |
| unset (auth off) | When set, mutating |
|
| Phase age (seconds) after which a fresh host lock reads STUCK. |
| built-in per-phase defaults | JSON object of per-phase stuck thresholds, merged over the built-ins. |
|
| Seconds between orphan-run reaper passes ( |
The data dir never depends on the working directory. With S2DOCS_DATA_DIR unset the default is a fixed path: a source checkout uses its own ./data, and anything else uses a per-user directory. This closes the split-database incident — a server and an MCP client that were launched from different working directories (an MCP config that predates the env fix spawns s2docs mcp with cwd set to the client's profile dir) used to read and write two different stores, leaving a shadow DB next to an unrelated cwd. serve and mcp still print a loud stderr warning when the variable is unset, now naming the resolved path. S2DOCS_DB and S2DOCS_WORKSPACE overrides are unchanged.
Auth is opt-in. Set S2DOCS_AUTH_TOKEN and the server requires Authorization: Bearer <token> or X-S2docs-Token: <token> on every non-GET/HEAD/OPTIONS request under /api and on every request to the HTTP MCP endpoint /mcp; a missing or wrong token is 401 (compared in constant time). GET routes and the static web UI stay open, and stdio MCP is unaffected (it is local). With the variable unset the behaviour is unchanged — no auth — and GET /api/health and the MCP server_info tool report auth_required: false (they report only the boolean, never the token).
deploy_push takes the host lease. A deploy now arbitrates the host through the same lock the build and test services use, so it can never copy onto a host another owner holds. Pass owner if you already hold the lease — the push reuses it and leaves it locked; otherwise a free host is claimed as deploy:<id> for the copy+verify window and released afterwards (owner-conditional, even on failure), and a host held by a different owner is a 409 (HostLocked). The effective owner is recorded on the deployment row. The deploy_verified orchestration gate no longer falls back to the host's latest deployment: the step must name the deployment id from deploy_push as an artifact, and it must belong to the project's host and be verified.
Related MCP server: open77-devkit
Web UI
s2docs serve mounts a small vanilla-JS SPA at / (hash routes, no framework, no build step). Besides the browse/search sections (#/<game>/…) it has install-wide operations pages for watching work on remote hosts, and a page for the server's orchestration plans:
Overview (
#/overview) — a mission-control wallboard, not a copy of the four pages: a hero card for the one thing happening right now (running test leads, then builds, then the queue), a machine dock (one LED chip per host — pulsing gold = busy, red = STUCK, gray = idle), and three lanes: the queue rail, the verdict wall (one colour-coded tile per job, newest first, like a CI status board) and a compact feed of the newest runs. Read-only; every tile/line links to its record. Same auto-refresh cadence as Activity.Hosts (
#/hosts) — the registry plus live lock state: shell, GPU (from the last probe), how long ago it was probed, and the current lock owner with fresh/stale + heartbeat age, its phase (what the owner is doing) and a STUCK badge. A lock is STUCK when its heartbeat is fresh but its phase has not moved for longer than the server's threshold — liveness is not progress, so a worker that heartbeats faithfully while its compile hangs still shows up. Clicking a host opens#/hosts/<id>with its facts JSON, lock history (claim / takeover / release / phase-change events) and its recent builds, deployments and test runs. Read-only; auto-refreshes every 5 s while open.Activity (
#/activity) — the page to watch instead of tailing logs: a Now section (the running test run — the samename / step / state / elapsedfields as the in-game TEST STATUS HUD strip — and active/queued build runs, freshest first), a By host section grouping every recent build run, test run and deployment under the host it ran on, and a collapsed full history. Auto-refreshes every 5 s while a run is active, 15 s when idle.Orchestration (
#/<game>/projects) — the multi-step orchestration DAGs (distinct from runs): each project opens to a step-level view with a dependency graph, and per step its state, gate, evidence counts, updated time and notes. For the build/test/deploy runs those steps drive, use Activity.Jobs (
#/jobs) — the job ledger + queue: one record per requestedtest/demo/finalrun (intake, timeline, screenshots/logs, links, and a mandatory close-out summary). A per-host queue board (running on top, then queued by position, error/crash counts in red);#/jobs/<id>shows the intake, the screenshot gallery, linked records and the summary card (first on a finished job). Jobs never claim the host lease — the build/test/deploy tools still do; a job links to them. Seedocs/TEST_JOBS.md.
Activity is service-fed. A row appears on that page only when work goes through the s2docs build / test / deploy services (build_start / test_start / deploy_push over MCP, or the equivalent s2docs CLI) — it is not a view of any CS2 that happens to be running anywhere, so an empty page means nothing has been recorded yet, not that the page is broken; the empty state says so and points at the commands to start something. All these pages read the existing JSON API (/api/hosts, /api/hosts/{id}/locks, /api/builds, /api/deploys, /api/test-runs, /api/projects, /api/projects/{id}, /api/evidence); nothing there can mutate a host or a run.
MCP
Hermes Agent (native tools as mcp_s2docs_*; stdio, no server process needed)
hermes config set mcp_servers.s2docs.command /Users/you/source/s2docs/.venv/bin/s2docs
hermes config set mcp_servers.s2docs.args '["mcp"]'Claude Code
claude mcp add s2docs -- uv --directory /Users/you/source/s2docs run s2docs mcp
# or, with `s2docs serve` running:
claude mcp add --transport http s2docs http://127.0.0.1:8000/mcpClaude Desktop / other stdio clients
{
"mcpServers": {
"s2docs": {
"command": "uv",
"args": ["--directory", "/Users/you/source/s2docs", "run", "s2docs", "mcp"]
}
}
}Docs tools (read-only) | |
| Full-text search over everything. Each hit's |
| Default, min/max, flags ( |
| Keyvalues (with choices), inputs and outputs including inherited ones, with |
| Fields, types, defaults, metadata, inheritance chain and subclasses (VData, netvars) |
| The effective definition after core → game → mod overrides |
| The cs_script API ( |
| Pulse visual-scripting node bindings |
| What changed between two indexed builds, at member granularity: one row per added/removed/changed schema field, entity member, game-event field, script symbol, convar, Pulse binding or Hammer class, grouped under its parent class/entity/event/library. Sections: convars, entities, schema, events, script_api, pulse, hammer_classes. |
| Valve's cs_script sample scripts, each with the API it uses |
| source2.wiki pages as Markdown, with URL and license for citation |
Build tools | |
| Type-checks a script with |
| Checks every cfg line against the indexed convars: unknown names (with suggestions), out-of-range values, cheat flags, client vs server |
| Local addon workspace ( |
Host tools | |
| Registry of test/build hosts (ssh target, shell flavor, probed facts: GPU/RAM/processes/CS2 build) |
| SSH-probe a host and store its facts ( |
| Server-side host locks with owner + TTL + heartbeat + phase. A fresh lock blocks other owners; a stale lock (crashed worker) is taken over automatically. Report a |
Stuck detection | The server, never the client, decides stuck-ness: a lock is |
The same operations exist on the CLI (s2docs host list|show|register|probe|lock|heartbeat|unlock, JSON out, exit 2 = locked; lock/heartbeat take --phase/--note, and host list/show print a STUCK: line on stderr) and the HTTP API (/api/hosts, /api/hosts/{id}/lock, …; 409 = locked; every host read carries lock.phase, lock.phase_age_sec and lock.stuck; /api/hosts/{id}/locks returns the claim/takeover/release/phase-change audit trail the Hosts page shows).
Build tools | |
| Start a server-owned run on a host: acquires the host lease ( |
| A run's record (status, exit code, parsed summary counts, material guard, artifacts) and recent runs |
| Tail the run's log — the log is UTF-16 (resourcecompiler), so this decodes it and reports the detected |
| Block server-side until the run finishes (bounded), or fail on timeout. |
Material guard | Scans the decoded log for |
| Mark the run cancelled and release its host lease |
Deploy tools | |
| Copy files to a host per a manifest ( |
| Re-check a recorded deployment's MD5s and update its status |
| Recent deployments, optionally per host |
CLI: s2docs build start|status|log|wait|cancel|list and s2docs deploy push|verify|list (global --json → one {"schema": "s2docs/v1", …} object on stdout, logs to stderr; exit codes 0 ok, 1 error, 2 locked, 3 not found, 6 partial, 7 timeout/cancelled, 8 material warnings under --strict-materials). HTTP: /api/hosts/{id}/builds, /api/builds/…, /api/deploys.
Evidence tools | |
| Store a structured evidence row for a project step: |
| Evidence rows (newest first), filtered by project, step and/or kind |
Test-run tools | |
| Open a server-side test session ( |
| Set the current step, finish |
| One run (or the current active run) and recent runs, optionally by state |
CLI: s2docs evidence add|list|show and s2docs test start|step|finish|clear|status|list. HTTP: /api/evidence, /api/evidence/{id}, /api/test-runs (+ /current, /{id}/step|finish|clear).
Job tools | |
| Enqueue a job (validated intake) — the |
| Jobs (newest first, with error/crash counts), one job with its timeline/links/artifacts, and the head of a host's queue when its lease is free |
| Set host/queue order, queued → running, and append timeline events (a |
| Copy a local file into the job's artifacts (append-only), or ask the runner for a screenshot |
| Attach a test run/build/deploy/evidence/project, close out (all four summary fields required; |
CLI: s2docs job enqueue|list|show|next|start|event|attach|shot-request|finish|restatus|cancel|watch (the global exit codes: 3 not found, 4 conflict, 9 validation). HTTP: /api/jobs (+ /next, /{id}, /{id}/assign|start|event|link|screenshot-request|finish|restatus|cancel, /{id}/artifacts/{name}), GET /api/artifacts/{job}/{name}. Every job event also appends <data_dir>/job_events.jsonl (/api/health → job_events_jsonl). Full notes: docs/TEST_JOBS.md.
Orchestration tools | |
| Multi-step recipes: |
| Creates a persistent project (stored in SQLite) and returns the first ready step(s) |
| Ready steps, each with instructions, the tools to use, rendered prompt text, and its gate |
|
|
| State, history, and prompt text for clients that can't fetch prompts mid-task |
Orchestration
The server holds the plan and the quality gates. The client's model does the work. Start with the orchestrate prompt ("build an isometric Diablo-style viewer for CS2"), or call start_project directly:
start_project ─▶ brief (ready steps + tools + rendered prompt) ─▶ agent works ─▶ update_step(done)
▲ │ gate check
└──────────────── next ready steps (dependency DAG) ◀──────┘Gates are checked on the server, not taken on trust:
scripts_typecheckre-runstscon every.jsfile in the addon,cfgs_validvalidates every.cfg,addon_exists, andevidence— which requires at least one stored non-note evidence row for the step (viaadd_evidence); notes and artifacts alone no longer pass.cs2_live_testaddshost_claimed(the project really holds the host lease, ownerproject:<id>) anddeploy_verified— the deployment id fromdeploy_push, recorded as an artifact of the step, must belong to the project's host and beverifiedin the deploy registry (there is no latest-for-host fallback, so a stale or unrelated deployment can never satisfy it). A failed gate returns the exact errors (HTTP 409 / MCP tool error).Steps form a DAG. Independent steps (e.g. camera script and test cfg) become ready together, so a client can run them in parallel or hand them to subagents.
Projects persist. Any session can pick one up with
next_step <id>, and the web UI's Orchestration page shows the step-level DAG, gates and evidence, and can start projects or move steps.Steps are snapshotted when a project starts, so editing
orchestration/workflows.pynever changes a project in flight.
Prompts: orchestrate, cs2_script, hammer_io_logic, server_config, deadlock_mod, cs2_map_rebuild, explain_symbol. Each is a Markdown template in src/s2docs/prompts/templates/, filled at render time with live data from the database (e.g. the current Instance method index). Edit the .md files to tune them. The same prompts are available at GET /api/prompts and POST /api/prompts/{name}/render.
Resources: s2docs://cs2/cs_script/point_script.d.ts and tsconfig.json (put them next to your scripts for editor IntelliSense), plus s2docs://cs2/cs_script/examples/{name}.
Architecture
src/s2docs/
config.py game registry (repo, mod dir, sparse patterns), settings
ingest/
sources.py shallow + blob-filtered + sparse git checkout
parsers/ pure parsers: convars, fgd, schema (.h), gameevents (KV1), pulse, d.ts, steam.inf
loader.py one transaction per build → normalized tables + FTS rows
db/
migrations/*.sql versioned schema (PRAGMA user_version)
connection.py read-only URI connections for readers, WAL for the writer
fts.py identifier splitting + injection-safe FTS5 query builder
repository.py every read query (parameterized, recursive CTEs for inheritance)
models.py Pydantic models shared by the API and MCP
prompts/ prompt registry + Markdown templates
api/ FastAPI app + routes (MCP mounted at /mcp, SPA at /)
build/ validate_script (tsc), validate_cfg, workspace (addon files)
orchestration/ workflows.py (registry) + engine.py (projects, DAG, gates)
hosts.py host registry + server-side leases (claim/heartbeat/release, TTL expiry) + lock-event audit (host_lock_events) for the Hosts page
builds.py server-owned build runs (SSH launch, UTF-16 log tail, host lease)
deploys.py deployment registry (scp push + Get-FileHash MD5 verification)
evidence.py structured evidence store — what the `evidence` gate checks (kind/ref/data)
test_runs.py in-game test sessions mirroring the TEST STATUS HUD strip (start/step/finish/off)
mcp_server.py MCP tools/prompts/resources (mcp SDK 2.x MCPServer)
web/ index.html, app.js, style.css (no build step)SQLite design
Every data table hangs off
builds(id)withON DELETE CASCADE. A whole build is written in one transaction, so readers see either the old build or the complete new one. Re-indexing the same build number replaces it. The last N builds are kept (--keep, default 5) fordiff_builds.search_ftsis an FTS5 index over the current build of each game.namekeeps identifiers whole (_is a token character, somp_round*prefix-matches).name_partsand the body hold split forms (m_iHealth→m i health), so word searches find identifiers. Results are ranked by bm25 with column weights, with exact name matches first.User input never becomes FTS syntax: it is reduced to quoted tokens and bound as a parameter.
LIKEfilters escape%and_. The only dynamic SQL is placeholder lists and fixed column names.Entity and schema inheritance are resolved with recursive CTEs.
row_number()keeps the nearest definition of an overridden member.The API and MCP read docs data read-only (
mode=ro), one connection per request or tool call. Only orchestration (projects,project_steps,project_events) writes, through the WAL writer connection.
Development
uv run pytest -q # 115 tests: parsers, repository, API, MCP, build tools, orchestration, hosts, builds/deploys (incl. material guard), evidence, test runs, web-UI visibility
uv run ruff check src tests && uv run ruff format src tests
uv run python scripts/check_frontend.py # renders every SPA route in headless Chrome (server on :8765; extra routes as args)Roadmap
Human docs: load the Valve Developer Community (MediaWiki API), source2.wiki (git), and the CounterStrikeSharp and Deadworks docs into the existing
docstable, with license and source URL per page.Scheduled sync: cron or CI running
s2docs sync. It's cheap because the checkouts are incremental.Deeper Deadlock data: hero, ability and item VData values (KV3) from the VPKs via the Source 2 Viewer CLI.
Semantic search: embeddings alongside FTS5 for natural-language questions.
Available Tools
73 toolsadd_evidenceA
Record structured evidence for a step. This is what the evidence gate checks — a step with an
evidence gate CANNOT be marked done until at least one non-note row exists for it. Use kind='note'
only for a supplementary remark (it does not satisfy the gate).
Pass `step_id` to attach the row to a project step, or omit it to record evidence at project
level (a measurement, a console transcript, a negative result). A step-less row satisfies no
step gate, by design.| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Path / url / command the evidence points at | |
| data | No | Structured detail: e.g. {'pixel_diff_pct': 1.2, 'noise_floor': 0.5} or {'md5': '...'} | |
| kind | Yes | ||
| step_id | No | Project step the evidence proves (e.g. 'research'). Omit for project-level evidence that is not tied to a step — the column is nullable and the REST route has always accepted null, so MCP must not be stricter than HTTP. | |
| project_id | Yes | Project id from start_project, e.g. 'p-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| ref | No | Path / url / command the evidence points at |
| data | No | Structured detail (md5s, pixel diff pct, transcript excerpt) |
| kind | Yes | |
| step_id | No | Owning step; None = project-level evidence |
| created_at | Yes | |
| project_id | No | Owning project; None when the row is anchored to a test run with no project |
| test_run_id | No | Test run this evidence records (a human-confirm verdict, a transcript, ...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation profile (readOnly=false, idempotent=false, destructive=false); the description adds non-obvious domain behavior: a step with an evidence gate cannot be marked done until a non-note row exists, and a step-less row satisfies no step gate by design. That gate interaction is exactly the context annotations cannot carry.
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?
Front-loaded with the gate rule, then parameter-level guidance in short paragraphs. Slightly more prose than strictly needed (the REST-route justification is rationale rather than instruction), but every sentence carries actionable meaning.
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 need no explanation, and the description covers the mutation's downstream effect and the step_id optionality rule. It does not sketch what a valid ref/data pairing looks like per kind, but that is a minor gap for a 5-param create tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, but the description still adds meaning to step_id (omit for project-level evidence, contrast with the REST route accepting null) and to kind (note vs. gate-satisfying kinds). Remaining kinds like pixel_diff and file_hash are only enumerated in 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?
States a specific verb and resource ('Record structured evidence for a step') and immediately ties it to the evidence gate. An agent can tell this is the write-side counterpart to list_evidence without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use kind='note' (supplementary remark, does not satisfy the gate) and when to omit step_id (project-level evidence such as measurement, console transcript, negative result). Both branches are covered with their consequences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_cancelADestructiveIdempotent
Cancel a run: mark it cancelled and release its host lease (terminates the process when this server owns it).
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | No | |
| lock | No | The host lock this run holds (owner build:<id>), when it is still its own |
| notes | No | |
| owner | Yes | Host-lock owner holding this run's lease, 'build:<id>' |
| handle | No | Process handle (pid) when known |
| status | Yes | |
| command | Yes | |
| host_id | Yes | |
| summary | No | Parsed counts from the log summary line |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| log_path | No | |
| warnings | No | Material-guard findings; None when the log was clean or unscanned |
| artifacts | No | |
| exit_code | No | |
| created_at | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive, idempotent, non-readonly behavior, so the bar is lower; the description still adds real context beyond them by explaining the host-lease release and the conditional process termination when this server owns the host. It does not say what happens to partial artifacts or whether cancellation is refused in terminal states.
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?
One sentence, front-loaded with the action, with the mechanism in a tight parenthetical. Nothing is wasted and nothing is buried.
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 need not be explained, and the mutation semantics are covered. Still missing for a destructive sibling-rich tool: how to identify the run, and how this differs from job_cancel.
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% for the single required run_id, so the description must compensate, and it does not — no format, no hint to obtain it from build_list or build_status. The parameter is entirely opaque from the text.
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 ('Cancel a run') and adds the concrete effect of marking it cancelled and releasing its host lease. It is distinguishable from build_start/build_status/build_wait, though it does not explicitly separate itself from the similarly named sibling job_cancel.
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?
Usage is implied by the name and effect but never stated: no guidance on when to cancel versus letting a build run, and no mention of the job_cancel alternative for job-level runs. An agent must infer the calling conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_listARead-onlyIdempotent
Recent build runs (newest first), optionally one host and/or active only.
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | Only queued/running runs | |
| host_id | No | Restrict to one host |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, so safety is covered. The description usefully adds result ordering (newest first), which annotations cannot express, but omits pagination, result limits, and retention window for a list operation.
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 fragment with no waste; the resource and ordering come first, filters second. The compressed 'and/or' phrasing is slightly terse but still parseable.
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 and annotations cover the safety profile, so the description need not explain return values. For a low-complexity two-optional-param list tool it is nearly sufficient, with only result count/pagination left unstated.
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 100% and both parameters are already documented ('Only queued/running runs', 'Restrict to one host'). The description only restates those filters in shorthand, adding no syntax or default-behavior detail, so baseline 3 applies.
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+resource (list recent build runs) plus ordering (newest first) and optional filters, so the agent knows exactly what comes back. It does not distinguish itself from siblings like build_status or diff_builds, which is the only gap.
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 filter conditions ('optionally one host and/or active only') imply the browse-recent-runs use case, but there is no explicit when-to-use vs. build_status, build_log, or diff_builds guidance and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_logARead-onlyIdempotent
Tail a build run's log. The log is UTF-16 (resourcecompiler) — this decodes it for you,
returning the detected encoding, whether the tail was truncated, and any MATERIAL GUARD
warnings found in the full log (see build_status).
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Tail size in lines | |
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| size | Yes | Log file size in bytes |
| lines | Yes | |
| run_id | Yes | |
| encoding | Yes | Log text encoding detected on read (utf-16 or utf-8) |
| warnings | No | Material-guard findings over the whole log; None when clean |
| truncated | No | True when only the tail was returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, closed-world operation. The description adds useful behavioral context beyond annotations: it decodes UTF-16 logs, reports detected encoding, indicates truncation, and surfaces MATERIAL GUARD warnings from the full log. It does not contradict any annotations.
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 sentences and front-loads the core action. Every sentence adds useful information: the first states the purpose, and the second explains decoding, truncation, and warnings. There is no wasted wording.
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 low-risk annotated read operation and the presence of an output schema, the description covers the key special behaviors an agent needs: UTF-16 decoding, truncation, and MATERIAL GUARD warnings. Minor gaps remain around run_id semantics and explicit selection versus sibling tools, but overall it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: the lines parameter is documented in the schema, but run_id has no description. The description implies that run_id identifies the build run whose log is tailed, but it does not document format or acquisition. This is adequate but leaves a clear 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 states a specific verb and resource: "Tail a build run's log." It clearly identifies the operation and the special UTF-16 decoding behavior. However, it does not explicitly differentiate itself from the closely related sibling build_status, so it falls 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?
The description does not say when to use build_log versus alternatives such as build_status or build_wait. The parenthetical "see build_status" points to another tool but does not establish selection criteria. Usage is only implicit from the tool name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_modelA
Write a Source 2 model document (.vmdl) for a mesh that is already inside the addon.
`mesh` is addon-relative (e.g. models/probe/probe.dmx). The document copies the shape the
game's own compiler accepts — compile it on a host with resourcecompiler afterwards
(build_start). Returns the written path. Use overwrite=true to replace an existing .vmdl.| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
| mesh | Yes | ||
| name | Yes | ||
| addon | Yes | Addon name: lowercase [a-z0-9_], e.g. 'jump_arena' | |
| overwrite | No | ||
| translate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false; the description adds the useful operational detail that overwrite=true will replace an existing .vmdl and that the tool returns the written path. It also discloses the important constraint that the document is only compiler-acceptable and must be built on a host with resourcecompiler, which an agent could not infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the path convention, then the follow-up build step. Slight redundancy with the multi-line indentation, but no wasted content.
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 what the tool produces, the path semantics, the overwrite behavior, and the downstream build step, and an output schema exists so return values need not be spelled out. The remaining gap is the unexplained `name` and `translate` parameters for a six-parameter write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, and the description compensates partially: it defines `mesh` as addon-relative with an example and explains `overwrite`. However, `name` and especially `translate` (an array of numbers, presumably an offset) are left entirely undefined 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?
States a specific verb and artifact: writes a Source 2 model document (.vmdl) for a mesh already in the addon. It also distinguishes itself from the sibling build_start by clarifying that this tool only emits the document and that compilation happens elsewhere.
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 the sequencing rule (compile afterwards via build_start) and the condition for the overwrite flag (replace an existing .vmdl). It does not name an explicit alternative for building without writing a document, but the routing to build_start is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_startADestructive
Start a server-owned build run on a host: acquires the host lease, runs the command over SSH and
returns a run id immediately. Do NOT poll with sleeps — use build_wait(run_id) or build_status. The
host lease is released automatically when the run reaches a terminal status. The lease's phase is
the run kind (e.g. 'compile'), so a run whose compile hangs while its heartbeat stays fresh reads
STUCK on list_hosts — the server, not the client, decides that.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Label for the run, e.g. 'build', 'resourcecompiler' | build |
| notes | No | ||
| command | Yes | Shell command to run on the host over SSH (detaching/hiding is its job) | |
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' | |
| log_path | No | Server-local path for the captured log |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | No | |
| lock | No | The host lock this run holds (owner build:<id>), when it is still its own |
| notes | No | |
| owner | Yes | Host-lock owner holding this run's lease, 'build:<id>' |
| handle | No | Process handle (pid) when known |
| status | Yes | |
| command | Yes | |
| host_id | Yes | |
| summary | No | Parsed counts from the log summary line |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| log_path | No | |
| warnings | No | Material-guard findings; None when the log was clean or unscanned |
| artifacts | No | |
| exit_code | No | |
| created_at | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and openWorldHint=true; the description adds genuinely non-obvious behavior: the call is asynchronous (returns a run id immediately), the host lease is server-owned and auto-released at terminal status, and lease phase equals the run `kind`. It omits any note on failure modes of the SSH command itself or permission requirements, keeping it short of a 5.
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?
What the tool does is front-loaded in the first clause, followed by operational guidance and then lease semantics. The STUCK/list_hosts passage is dense and slightly tangential to invoking this tool, though it does explain how to interpret the resulting run's state.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values needn't be explained, and the description still states that a run id comes back immediately. Async behavior, lease lifecycle, and the correct follow-up call are all covered, which is everything an agent needs to invoke this 5-parameter, 2-required 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 coverage is 80%, so the baseline is 3, but the description adds real meaning to `kind`: its value becomes the lease phase shown on list_hosts, which is not stated in the schema. `notes` and `log_path` are left entirely to the schema, so this is additive 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?
States a specific verb and resource ("Start a server-owned build run on a host") plus the mechanism (acquires lease, runs command over SSH, returns run id immediately). This clearly distinguishes it from build_status, build_wait, build_cancel, and build_list in the sibling set.
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 routes the agent away from sleep-polling toward build_wait(run_id) or build_status, which is the key decision an agent faces after calling this. It does not, however, contrast build_start with adjacent launchers like test_start or deploy_push, so the sibling-exclusion guidance is partial rather than complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_statusARead-onlyIdempotent
One build run's record: status, exit code, parsed summary counts, material guard and artifacts.
`warnings` carries the MATERIAL GUARD findings when the log referenced missing/reserved materials
(Valve's `_vrf/` subtree, or another map's `maps/<other>/` subtree): counts per kind plus the first
few offending paths. Such a run can still be 'succeeded' — the resourcecompiler exits 0 and the map
then error-renders as a red/black checkerboard, so treat a non-None `warnings` as NOT clean.| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | Run id from build_start, e.g. 'b-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | No | |
| lock | No | The host lock this run holds (owner build:<id>), when it is still its own |
| notes | No | |
| owner | Yes | Host-lock owner holding this run's lease, 'build:<id>' |
| handle | No | Process handle (pid) when known |
| status | Yes | |
| command | Yes | |
| host_id | Yes | |
| summary | No | Parsed counts from the log summary line |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| log_path | No | |
| warnings | No | Material-guard findings; None when the log was clean or unscanned |
| artifacts | No | |
| exit_code | No | |
| created_at | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, openWorldHint=false), and the description adds critical domain behavior beyond them: a run can appear 'succeeded' while material guard warnings indicate the map will error-render as a checkerboard. This is a high-value gotcha that directly affects interpretation.
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 first sentence front-loads the record contents, and the second explains the warnings guard. It is somewhat detailed but the material-guard explanation earns its place because it prevents a critical misinterpretation.
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 an output schema, annotations, and complete schema coverage for the single parameter, the description is nearly complete. It explains the warning field's behavioral meaning but could briefly clarify its relationship to build_wait and build_log.
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 100%, and the single run_id parameter is already documented in the schema as coming from build_start. The description adds no additional parameter meaning, so the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as 'One build run's record' and enumerates what it contains: status, exit code, summary counts, material guard warnings, and artifacts. It lacks an explicit action verb like 'retrieve' and does not distinguish itself from close siblings such as build_log, build_wait, or build_list.
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 does not state when to use this tool versus build_log, build_wait, or build_list. The only implied usage is inspecting a single run's record, with no explicit alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_waitARead-onlyIdempotent
Block (server-side, no client sleep loop) until the run finishes, then return its record. Raises if it is still running after timeout_sec. With strict_materials, a run whose log has material-guard warnings is an error even though its status is 'succeeded'.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | ||
| timeout_sec | No | Give up after this many seconds (exit 7) | |
| strict_materials | No | When true, fail the call if the material guard flagged warnings |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | No | |
| lock | No | The host lock this run holds (owner build:<id>), when it is still its own |
| notes | No | |
| owner | Yes | Host-lock owner holding this run's lease, 'build:<id>' |
| handle | No | Process handle (pid) when known |
| status | Yes | |
| command | Yes | |
| host_id | Yes | |
| summary | No | Parsed counts from the log summary line |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| log_path | No | |
| warnings | No | Material-guard findings; None when the log was clean or unscanned |
| artifacts | No | |
| exit_code | No | |
| created_at | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered; the description adds genuinely new behavior — server-side blocking, a raise on timeout, and the subtle rule that strict_materials turns material-guard warnings into an error even when status is 'succeeded'. That last point is exactly the kind of non-obvious semantics an agent cannot infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: what it does, what failure looks like, and the strict-mode edge case. Blocking behavior is front-loaded, and there is 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?
An output schema exists, so return-value detail is unnecessary, and the description still notes that the run record is returned. For a long-blocking tool with error-on-timeout behavior, the essentials are covered; only an explicit pointer to build_status as the non-blocking alternative 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 coverage is 67%, with timeout_sec and strict_materials already documented in the schema. The description adds meaning for strict_materials beyond the schema's phrasing by explaining the failure condition relative to the run's success status, and the timeout raise condition is reinforced. run_id is self-evident.
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 — block until the run finishes, then return its record — and the parenthetical '(server-side, no client sleep loop)' distinguishes it from the polling pattern an agent would otherwise use. It never names the sibling it replaces (build_status), so it falls short of 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?
Clear context for when to call: you want to wait for completion rather than poll. Timeout behavior and the strict_materials escalation are spelled out. However, it does not explicitly route an agent to build_status for non-blocking checks or to build_cancel when waiting is undesirable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
claim_hostAIdempotent
Claim exclusive use of a host. Fails if another owner holds a fresh lock — a stale lock
(heartbeat older than its TTL, e.g. from a crashed worker) is taken over automatically.
Always report a phase (what you are doing); the server flags a lock STUCK when its heartbeat
is fresh but the phase has not moved for too long, so keep the phase current (pass a new phase
to heartbeat_host) as you progress. Heartbeat while you work; release with release_host when done.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Free text for the dashboard, e.g. the current step | |
| force | No | Take over even if another owner's lock is still fresh | |
| owner | Yes | Who is asking: workstream/session id, e.g. 'ws/occluder-wire', 'p-1a2b3c4d', 'coord-session' | |
| phase | No | What you are doing, e.g. 'compile', 'test' — powers stuck detection | |
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' | |
| ttl_sec | No | Lock lifetime without heartbeat, seconds (min 60) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | free text from the owner, e.g. the current step |
| fresh | Yes | heartbeat within ttl (False = stale, can be taken over) |
| owner | Yes | |
| phase | No | what the owner is doing ('', 'compile', 'test', ...); '' = not reported |
| stuck | No | fresh heartbeat but the phase has not moved past the server's threshold (liveness != progress) |
| age_sec | Yes | seconds since the last heartbeat |
| host_id | Yes | |
| ttl_sec | Yes | |
| acquired_at | Yes | |
| phase_since | No | when the current phase started (NULL when no phase) |
| heartbeat_at | Yes | |
| stuck_reason | No | why the server marked this lock stuck |
| phase_age_sec | No | seconds since the phase was last changed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=true, so the safety profile is covered; the description adds substantial unstated behavior—stale-lock takeover, STUCK detection driven by phase freshness, and the expectation to keep phase current. It doesn't explain force or the TTL interaction explicitly, which is the only real 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?
Four sentences, front-loaded with the core operation, then failure semantics, then the phase/heartbeat obligation and release step. Dense and useful throughout, though the phase guidance is slightly repetitive.
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 lock-mutation tool with an output schema, the description covers acquisition, failure, takeover, stuck detection, and release—everything an agent needs to invoke 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 100%, so baseline is 3; the description adds meaning by tying phase to server-side stuck detection and to heartbeat_host updates, which the schema only hints at. It does not discuss force or ttl_sec semantics, so it exceeds baseline without being 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?
States a specific verb and resource ('Claim exclusive use of a host') and positions the tool within a lifecycle by naming heartbeat_host and release_host. An agent can tell it apart from those siblings without opening any schema.
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 explains the core condition: fails when another owner holds a fresh lock, but a stale lock is taken over automatically. It goes on to prescribe the follow-up flow (heartbeat while working, release_host when done), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_listBRead-onlyIdempotent
Recent deployments (newest first), optionally one host.
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | No | Restrict to one host |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful behavioral context by stating results are newest first, but it does not define how many 'recent' deployments are returned or whether pagination applies.
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 compact sentence that front-loads the resource and ordering with no wasted wording. Every phrase contributes useful 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?
For a one-parameter, read-only list tool with a full schema, rich annotations, and an output schema, the description is largely sufficient for correct invocation. The main remaining ambiguity is the scope of 'recent' and any result limit, but that is not required to call the tool successfully.
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 100%, and the host_id parameter is already documented as 'Restrict to one host.' The description's 'optionally one host' duplicates that schema information without adding format or edge-case semantics.
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 identifies the resource (deployments), the ordering (newest first), and the optional host filter. It is clear what the tool returns, but it does not explicitly name a verb such as 'list' or distinguish itself from sibling actions like deploy_push and deploy_verify.
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 such as deploy_verify, deploy_push, or the other *_list tools. The only conditional detail, 'optionally one host,' describes filtering rather than tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_pushADestructive
Copy files to a host and verify what landed (Get-FileHash over SSH). Returns a deploy id whose entries carry the server-checked md5 + verified flags. Call deploy_verify later to re-check.
The push takes the host lease for the copy+verify window: a host held by another owner is a
conflict (pass that owner if it is you), a free host is claimed as 'deploy:<id>' and released
when the copy finishes. Inside an orchestration project the project already holds the lease as
'project:<project_id>', so pass that as `owner` (the `cs2_live_test` deploy step does).| Name | Required | Description | Default |
|---|---|---|---|
| addon | No | ||
| files | Yes | Manifest: {path, local} entries to copy | |
| owner | No | Your host-lock owner if you already hold the lease (the push reuses it and leaves it locked). Inside an orchestration project pass 'project:<project_id>' — the project holds the lease for the whole run | |
| verify | No | Re-check MD5s on the host after copying | |
| dry_run | No | ||
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' | |
| parallel | No | ||
| dest_root | Yes | Remote destination root, e.g. 'C:/iso_build/addons' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| addon | No | |
| notes | No | |
| owner | No | host-lock owner effective for this push: 'deploy:<id>' when the server took the lease itself, else the caller's owner whose lease was reused |
| status | Yes | |
| entries | No | |
| host_id | Yes | |
| web_url | No | Absolute URL of this deployment's page in the web UI (Activity page) |
| dest_root | Yes | |
| created_at | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructive, non-idempotent, open-world): it discloses the host-lease lifecycle (claimed as 'deploy:<id>', released when the copy finishes), the conflict semantics, and the project-lease convention 'project:<project_id>'. This is exactly the mutating-side-effect context an agent needs before invoking a destructive 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?
Front-loads the action and the post-check in the first sentence, then details the lease model. Dense but mostly earning its place; the parenthetical asides ('the `cs2_live_test` deploy step does', 'hashed/sized on push') add a bit of clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so describing return values is optional — the description covers them lightly (deploy id entries with md5 + verified flags). Lease and conflict semantics are complete; the only shortfall is unexplained secondary parameters (dry_run, parallel, addon).
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 63% schema coverage, the description compensates by explaining `owner` in depth (pass another's owner if it's you, pass 'project:<project_id>' inside a project) and implying verify behavior and the file manifest. However, `dry_run`, `parallel`, and `addon` are not explained anywhere, leaving gaps.
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+resource: copy files to a host, verify hashes over SSH, return a deploy id with md5/verified flags. It explicitly distinguishes itself from the sibling deploy_verify ('Call deploy_verify later to re-check'), so an agent can route between them without opening 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?
Gives clear operational context: call deploy_verify afterward for re-checks, and pass `owner` when another party holds the lease or when inside an orchestration project. It explains the conflict case (host held by another owner) but doesn't broadly state when NOT to use this versus deploy_list or build flows — still strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_verifyBIdempotent
Re-check a recorded deployment's MD5s on the host and update its status.
| Name | Required | Description | Default |
|---|---|---|---|
| deploy_id | Yes | Deploy id from deploy_push |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| addon | No | |
| notes | No | |
| owner | No | host-lock owner effective for this push: 'deploy:<id>' when the server took the lease itself, else the caller's owner whose lease was reused |
| status | Yes | |
| entries | No | |
| host_id | Yes | |
| web_url | No | Absolute URL of this deployment's page in the web UI (Activity page) |
| dest_root | Yes | |
| created_at | Yes | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true. The description usefully adds that the check runs on the host and that status is mutated, but it omits what happens on checksum mismatch (does the deploy fail, does the tool error, does status change to failed?) – the single most important behavioral fact for a verify 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?
One sentence, front-loaded with the action resource, zero filler. Every clause carries 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?
Output schema exists, so return values need not be explained, and the parameters are fully documented. What's missing is the failure semantics and any prerequisite state (deployment must exist and be in a verifiable state), which matters for a status-mutating 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 coverage is 100% and deploy_id already documents its provenance ('Deploy id from deploy_push'). The description adds nothing about the parameter, so baseline 3 applies.
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: re-check a recorded deployment's MD5s on the host, then update its status. That is clearly distinct from deploy_push and deploy_list in the sibling set, though it doesn't explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this versus deploy_push or deploy_list. The phrase 'recorded deployment' implies a prior deploy_push, and 're-check' implies verification, but neither prerequisite nor timing is stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_buildsARead-onlyIdempotent
Show what changed between two ingested builds, at member granularity: one row per added/
removed/changed schema field, entity member, game-event field, script symbol, convar, Pulse
binding or Hammer class. Each entry carries group (the parent class/entity/event/library) so
members cluster under it; before/after hold only that member's own value. counts gives the
exact per-section added/removed/changed breakdown ({section: {added, removed, changed}}), taken
BEFORE the per-section limit cap, so it stays true even when sections is truncated to the
first limit entries; totals[section] is the sum of that section's three counts. Use it after
a game patch to find code or configs that might break.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| to_build | No | Newer build number; default = current build | |
| from_build | No | Older build number; default = previous build |
Output Schema
| Name | Required | Description |
|---|---|---|
| game | Yes | |
| limit | No | Row cap applied to each section |
| counts | No | Per-section change-type breakdown `{section: {'added': n, 'removed': n, 'changed': n}}`, counted BEFORE the per-section `limit` cap — exact even when `sections` is truncated. `totals[section]` is the sum of that section's three counts. |
| totals | No | Full change count per section, before the per-section `limit` truncation |
| sections | Yes | |
| to_build | Yes | |
| from_build | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (readOnly/idempotent/openWorld) by disclosing output semantics that matter for correctness: `group` clusters members under their parent, `before`/`after` hold only the member's own value, and crucially `counts` is computed BEFORE the per-section `limit` cap so it remains accurate when output is truncated. That truncation caveat is exactly the kind of trait an agent could otherwise misread.
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?
Front-loaded with the action and granularity before descending into output-field mechanics. The tail (counts/totals/limit explanation) is dense and partly redundant with the existing output schema, costing some economy without being padding.
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 and annotations cover the safety profile, so the description is free to skip return values — yet it still spends most of its words describing result shape. What is missing is the reference to the `sections`/`limit` inputs it alludes to, leaving a small gap about how truncation is actually controlled.
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 100% and the defaults for to_build/from_build are already documented there, so the schema carries parameter meaning. The description arguably muddies things by referencing `sections` and `limit` as if they were inputs, yet neither appears in the input schema — an agent has no way to set them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Show what changed between two ingested builds') and immediately qualifies granularity ('one row per added/removed/changed ...'). The enumeration of member kinds (schema field, entity member, game-event field, script symbol, convar, Pulse binding, Hammer class) makes it unmistakably distinct from build_list or search_docs.
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 a concrete triggering context: 'Use it after a game patch to find code or configs that might break.' That is a clear when-to-use signal, but no explicit when-not or named alternative (e.g. compare against build_list for raw build metadata) is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_entities_with_ioARead-onlyIdempotent
Find entity classes (including base classes) that declare an input or output with this name. Subclasses inherit it too, so check candidates with get_entity.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| name | Yes | Input or output name, e.g. 'OnTrigger', 'SetHealth' | |
| side | No | server | |
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| limit | Yes | |
| total | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds valuable context that subclasses inherit the input/output and that candidates should be checked with get_entity, which is behavior beyond the annotations. It does not mention rate limits or auth, but those are less critical here.
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 core purpose and followed by a crucial inheritance note and follow-up action. Every sentence earns its place with zero 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 values need not be explained, and annotations cover safety. The description gives the essential behavior and a follow-up step, but the lack of any mention of 'side' or 'limit' leaves a minor gap for optional parameters.
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 50%: 'game' and 'name' are described in the schema, while 'side' and 'limit' have no description anywhere. The description only references 'name' indirectly ('input or output with this name') and gives no meaning for 'side' or 'limit', failing to compensate 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?
States a specific verb ('Find') and resource ('entity classes') with scope ('including base classes') and the search target ('input or output with this name'). It distinguishes itself from get_entity by directing follow-up checks, but does not explicitly differentiate from siblings like list_schema_classes or get_schema_class.
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?
Implies a workflow by saying 'check candidates with get_entity', giving some context on how to use results. However, it does not state when to use this tool versus alternatives (e.g., list_schema_classes) or any exclusions, leaving usage largely inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_addonBRead-onlyIdempotent
Show an addon's local root and file list.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
| name | Yes | Addon name: lowercase [a-z0-9_], e.g. 'jump_arena' |
Output Schema
| Name | Required | Description |
|---|---|---|
| game | Yes | |
| name | Yes | |
| root | Yes | Local content root of the addon |
| files | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds no behavior beyond that: it doesn't say whether the file list is recursive, whether paths are absolute, or what happens when the named addon does not exist locally.
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 with no filler or redundancy. It is efficient, though its brevity is also the source of the gaps in usage and behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with full schema coverage and an output schema, the essentials are present. The one thing an agent would still need is the relationship to list_addons and read_addon_file, which is absent from the description.
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 100%, and both parameters are well documented in the schema (game id values, the lowercase name pattern with an example). The description adds nothing beyond that, so the baseline of 3 applies.
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 action on a specific resource: it returns an addon's local root path and its file list, which is more than a restatement of the name. It does not differentiate itself from the nearby siblings list_addons and read_addon_file, so an agent still has to infer the split.
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 statement of when to call this instead of list_addons (which also deals with addons) or read_addon_file (which reads contents). No prerequisites, no exclusions, no alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_convarARead-onlyIdempotent
Get a console variable or command: default, min/max, flags (cheat, replicated, ...) and help text.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| name | Yes | Exact convar/command name |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| name | Yes | |
| flags | No | |
| max_value | No | |
| min_value | No | |
| description | No | |
| default_value | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is fully covered. The description adds only a listing of returned fields, which the existing output schema already supplies, so marginal behavioral value beyond structured data is modest.
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 sentence with zero waste, front-loaded with the verb and resource, and the return payload summarized in a compact parenthetical.
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?
A simple two-parameter lookup with an output schema and full annotations, so little prose is required; the description is sufficient to call it correctly. The only missing piece is explicit routing against list_convars.
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 100% and both parameters ('game' with an inline id list, 'name' as exact convar/command name) are fully documented in the schema. The description's mention of 'variable or command' and 'exact' name reinforces the schema but adds no new parameter meaning.
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?
Specific verb+resource ('Get a console variable or command') with an enumeration of what's returned (default, min/max, flags, help text). It is implicitly distinguishable from the plural sibling list_convars, but it never names that sibling to make the boundary explicit.
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?
Usage is implied by the singular 'get' framing and the exact-name requirement, but there is no explicit statement of when to use this over list_convars or search_docs, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docARead-onlyIdempotent
Get a community documentation page (source2.wiki) as Markdown, with its URL and license for citation.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Doc key from search_docs (e.g. 's2wiki:/Basics') or URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| url | Yes | |
| body | No | |
| game | No | |
| title | Yes | |
| source | Yes | |
| license | No | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds useful return context (Markdown body, URL, license for citation) that the annotations can't express, but says nothing about failure behavior for an unknown or malformed key.
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 tightly packed sentence with zero filler, leading with the action and resource and closing with the citation-relevant returns. Nothing is redundant with the title or schema.
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?
With an output schema present, the description does not need to explain return values, and it still notes the Markdown format and license. For a one-parameter read tool this is nearly complete; only the error path for an invalid key is unaddressed.
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 one parameter at 100% schema coverage, so the schema already explains 'key' and even gives an example format ('s2wiki:/Basics'). The description adds no syntax or format detail beyond that, so baseline 3 applies.
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 ('Get a community documentation page (source2.wiki)') plus the output medium (Markdown) and what accompanies it (URL and license). This implicitly separates it from search_docs and list_docs, though it never names those siblings to make the distinction explicit.
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 when-to-use or when-not-to-use guidance, and no alternative tool is named. Usage is only implied by the schema note that 'key' comes from search_docs, which suggests this is a follow-up fetch step rather than a discovery tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entityARead-onlyIdempotent
Get a Hammer entity: keyvalues (with choices), inputs and outputs, including inherited ones.
defined_in shows which base declares each member.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| side | No | server | |
| classname | Yes | Hammer classname, or 'side:classname' from a search key | |
| include_inherited | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| side | Yes | |
| bases | No | |
| origin | No | |
| members | No | |
| fgd_file | No | Valve FGD file that defines the class |
| tool_tip | No | |
| classname | Yes | |
| cpp_class | No | |
| tool_name | No | Name in Hammer's entity tool |
| class_type | Yes | |
| tool_group | No | |
| description | No | |
| inheritance | No | Runtime ancestor chain, nearest first |
| fgd_inheritance | No | Valve FGD base classes, nearest first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and closed-world, so the safety profile is fully covered. The description adds useful context that inherited members are merged in and that a `defined_in` field marks the declaring base, but nothing about how large a result can get or how missing entities behave.
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, zero waste, with the resource and payload contents front-loaded and the `defined_in` clarification as a short follow-up.
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 needn't be spelled out, and required params are clear from the schema. The one real gap is the undescribed `side` parameter, which also interacts with the `side:classname` input form mentioned in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: `game` and `classname` are documented, but `side` and `include_inherited` have no schema descriptions. The description partially compensates by explaining that inherited members are included, which maps to `include_inherited`, but `side` (server/client) is never explained at 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?
States a specific verb and resource ('Get a Hammer entity') and enumerates exactly what comes back: keyvalues with choices, inputs, outputs, and inherited members. That is far more specific than the sibling search_docs or find_entities_with_io, though it never names those siblings to contrast itself against.
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?
Usage is only implied: the required classname plus 'or `side:classname` from a search key' signals this is the follow-up lookup after a search. It never states when to prefer this over find_entities_with_io or get_schema_class, nor any preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exampleARead-onlyIdempotent
Get the full source of an example script. Prefer adapting these Valve-written patterns.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
| name | Yes | Example name, e.g. 'trace.js' or 'cs_script/trace.js' |
Output Schema
| Name | Required | Description |
|---|---|---|
| api | Yes | |
| name | Yes | |
| path | Yes | |
| origin | Yes | |
| content | No | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds only that the return is the full source of a Valve-written example; it says nothing about errors for unknown names or how the game parameter affects resolution.
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 short sentences with the core action front-loaded and no filler. The second sentence is advisory rather than descriptive, which slightly dilutes structure but still earns its place as guidance.
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?
With a complete output schema, full annotation coverage, and a two-parameter schema, the description covers what an agent needs to invoke it. Only the relationship to list_examples and failure behavior are left implicit.
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 100%, with both 'game' (enum-like list of ids) and 'name' (with a format example) documented in the schema. The description adds no parameter-level meaning beyond that, so it meets the baseline of 3.
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?
Names a specific verb and resource ('Get the full source of an example script'), which is unambiguous. It does not explicitly distinguish itself from the sibling list_examples, but 'full source' versus a listing is implicitly 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?
'Prefer adapting these Valve-written patterns' hints at the intended use (using examples as reference material), but there is no explicit when/when-not guidance or named alternative such as list_examples for discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_game_eventARead-onlyIdempotent
Get a game event's fields and types (the effective definition after core/game/mod overrides).
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| name | Yes | Event name, e.g. player_death |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| fields | No | |
| overrides | No | Lower-precedence files that also define this event |
| description | No | |
| source_file | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and closed-world, so the safety profile is covered. The description adds genuinely non-obvious behavior: the returned definition is the *effective* one after core/game/mod override resolution, which tells the agent the result may differ from raw source files.
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 sentence with the verb, resource, return content, and the override caveat in a tight parenthetical. Nothing wasted and the key scope qualifier is front-loaded.
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 shape needs no prose, and both required parameters are schema-documented. For a two-param read tool this is nearly complete; only the relationship to list_game_events is left unstated.
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 100% — both 'game' (cs2, deadlock) and 'name' (e.g. player_death) are documented inline. The description adds only indirect meaning via the override mention and does not restate formats, so the baseline 3 applies.
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 (Get) and resource (game event) and adds what is returned: fields and types. It reads clearly against neighbors like get_entity and get_schema_class by naming the 'game event' domain, though it never names list_game_events as the contrasting sibling.
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?
Usage is only implied: an agent can infer this is the detail lookup complementing list_game_events, but the description never states when to call it versus that lister or versus get_schema_class. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hostBRead-onlyIdempotent
One host's registry entry: ssh target, shell flavor, probed facts, and lock.
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| os | No | |
| lock | No | |
| facts | No | Probed facts (gpu, ram, node_path, cs2_path, ...) |
| notes | No | |
| shell | No | |
| ssh_key | No | |
| hostname | No | |
| probed_at | No | |
| ssh_target | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds the notion that the entry includes a 'lock' and 'probed facts', which hints at freshness/state, but it does not say what happens for an unknown host_id or how stale the probed facts may be.
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 compact sentence with no filler, and the field list is front-loaded. It is slightly terse to the point of being a fragment, but nothing is wasted.
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?
With a dedicated output schema and read-only annotations already present, the description only needs to frame what the entry contains, which it does. Missing only edge-case behavior (nonexistent host, lock semantics), which is minor at this complexity.
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 100% and the single host_id parameter is documented with an example ('build-pc'), so the schema carries the load. The description adds no syntax, format, or lookup-behavior detail beyond that, which is the baseline-3 case.
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?
Names the resource (one host's registry entry) and enumerates its contents (ssh target, shell flavor, probed facts, lock), so an agent knows exactly what comes back. It is a noun phrase without an explicit verb and only implicitly separates itself from list_hosts (via 'one host's'), but the intent is unmistakable.
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 statement of when to call this versus alternatives such as list_hosts, probe_host, or claim_host. The only routing hint ('Host id from list_hosts') lives in the schema, not the description, so an agent gets no usage guidance from the text itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectBRead-onlyIdempotent
Full project state: every step's status, notes, artifacts and recent events.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id from start_project, e.g. 'p-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| game | Yes | |
| goal | Yes | |
| addon | No | |
| steps | No | |
| title | Yes | |
| inputs | No | |
| status | Yes | |
| web_url | No | Absolute URL of this project's page in the web UI (Orchestration) |
| workflow | Yes | |
| created_at | Yes | |
| updated_at | Yes | |
| recent_events | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is fully covered. The description adds real value by disclosing the depth of the payload (per-step status, notes, artifacts, recent events), which tells the agent this is a heavy full-state read rather than a summary. It stops short of noting cost/verbosity or pagination 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?
A single compact clause with no filler, and the most useful information (breadth of state returned) is front-loaded. It loses a point only because the fragment lacks an action verb, which would have cost nothing to include.
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 one-parameter read tool with an output schema and full annotation coverage, the description supplies what the structured fields do not: the scope of returned state. Missing only an explicit signal about payload size or how it relates to list_projects.
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 100% and the single project_id parameter already documents its format and origin ('from start_project, e.g. p-1a2b3c4d'). The description adds nothing about the parameter, so the baseline 3 applies.
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?
Names the specific resource ('project state') and enumerates what it contains (step status, notes, artifacts, recent events), which implicitly distinguishes it from list_projects and start_project. However it is a noun fragment with no verb, and it never explicitly states 'retrieves one project by id' or names the sibling it differs from.
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 statement of when to call this versus list_projects, next_step, or update_step, and no preconditions. The agent must infer that this is the deep-read counterpoint to the shallow list tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prompt_textARead-onlyIdempotent
Render one of this server's prompts as text, for clients that can't fetch MCP prompts mid-task.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Prompt name: cs2_script, hammer_io_logic, server_config, deadlock_mod, orchestrate, cs2_map_rebuild, explain_symbol | |
| arguments | No | Prompt arguments |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine context — it explains this exists as a fallback for prompt-incapable clients — but says nothing about how arguments are applied or what the rendered text looks like.
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?
One sentence, zero waste, with the purpose front-loaded and the audience qualifier trailing as a subordinate clause. Nothing to trim.
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 need not be explained, and annotations cover safety. The one thing left implicit is how the optional 'arguments' object is threaded into the rendered prompt, a mild gap for a 2-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the 'name' parameter even enumerates the valid prompt names in its description. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.
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?
Specific verb ('render') plus specific resource ('one of this server's prompts') and output form ('as text'). It is unambiguous and no sibling tool in the list deals with prompts, so no explicit differentiation is needed, though none is offered.
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?
States the selecting condition clearly: clients that can't fetch MCP prompts mid-task. That is an explicit when-to-use rule, but there are no named alternatives or when-not-to-use exclusions (e.g. what a prompt-capable client should do instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schema_classARead-onlyIdempotent
Get an engine schema class or enum: fields with types, defaults and metadata, the inheritance chain and direct subclasses. Use it for networked fields, VData keys (Deadlock abilities) and plugin offsets.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| name | Yes | Class/enum name, or 'module:Name' from a search key | |
| module | No | Schema module, e.g. server, client | |
| include_inherited | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| name | Yes | |
| bases | No | |
| fields | No | |
| module | Yes | |
| derived | No | Direct subclasses |
| metadata | No | |
| field_count | No | |
| inheritance | No | |
| underlying_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so safety and determinism are covered. The description adds that results include the inheritance chain and direct subclasses, but says nothing about behavior when a class/enum is missing, name ambiguity across modules, or whether include_inherited changes output 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?
Two sentences, front-loaded with the verb+resource and then usage contexts; no filler, no restating of the title.
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?
With an output schema and annotations present, the description only needs to add selection and input nuance, and it partly does. However, for a two-required-param lookup against multiple games and modules, it omits how to disambiguate same-named classes and what include_inherited does, leaving real gaps 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 coverage is 75%: game, name (including the 'module:Name' form) and module are documented in-schema, while include_inherited has no description at all. The description's mention of the 'inheritance chain' hints at inherited-member behavior but never explains the include_inherited flag or the relationship between the name and module 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?
States a specific verb and resource ('Get an engine schema class or enum') and enumerates the payload: fields, types, defaults, metadata, inheritance chain and subclasses. An agent can tell it is a single-item lookup rather than a listing, though it never names the nearest sibling list_schema_classes explicitly.
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 second sentence gives concrete use cases (networked fields, VData keys for Deadlock abilities, plugin offsets), which is real selection guidance rather than a generic 'use this to get a class'. It stops short of stating exclusions or pointing to list_schema_classes/search for discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_script_apiARead-onlyIdempotent
Look up the CS2 cs_script (point_script) JavaScript API. A type name returns the type with all
members, including inherited ones. Anything else returns the matching members with signature and docs.
Instance is the Domain type.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
| symbol | Yes | Type ('CSPlayerPawn'), member ('Domain.TraceLine'), or bare member name ('TraceLine') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world), so the description focuses on lookup semantics: type lookups include inherited members, member lookups include signatures and docs. It also discloses the non-obvious `Instance` = `Domain` alias, which is not derivable elsewhere; only minor details like not-found behavior are absent.
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 short sentences, front-loaded with what it looks up and followed immediately by the return-shape distinction. No filler; only the final alias sentence is slightly tacked on rather than integrated.
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?
With an output schema present and the `game` parameter fully documented in-schema, the description only needs to nail lookup semantics and it does. Faint gaps remain around error/empty-result behavior for unknown symbols.
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 100%, so the 3 baseline applies, and the description earns a bump by explaining the consequence of each input form (type → full member set with inheritance; anything else → matched members with signature and docs) and by revealing the `Instance` alias that the schema does not mention.
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 ('Look up the CS2 cs_script (point_script) JavaScript API') and clarifies the two lookup modes. It is distinguishable from siblings like list_script_types and search_docs, but it never names those alternatives to reinforce the 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?
It explains what to pass (a type name vs. anything else) and what each form yields, which is implicit guidance on how to use it. It gives no guidance on when to prefer this over search_docs, get_doc, or get_schema_class, so the agent must infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
heartbeat_hostAIdempotent
Refresh your lock's heartbeat so it doesn't go stale mid-task. Heartbeating the SAME phase
does not clear stuck-ness (that is the point); report a new phase as your work moves on.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Free text for the dashboard | |
| owner | Yes | Who is asking: workstream/session id, e.g. 'ws/occluder-wire', 'p-1a2b3c4d', 'coord-session' | |
| phase | No | New phase; pass the same value to keep it, a new one to reset the clock | |
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | free text from the owner, e.g. the current step |
| fresh | Yes | heartbeat within ttl (False = stale, can be taken over) |
| owner | Yes | |
| phase | No | what the owner is doing ('', 'compile', 'test', ...); '' = not reported |
| stuck | No | fresh heartbeat but the phase has not moved past the server's threshold (liveness != progress) |
| age_sec | Yes | seconds since the last heartbeat |
| host_id | Yes | |
| ttl_sec | Yes | |
| acquired_at | Yes | |
| phase_since | No | when the current phase started (NULL when no phase) |
| heartbeat_at | Yes | |
| stuck_reason | No | why the server marked this lock stuck |
| phase_age_sec | No | seconds since the phase was last changed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so safety/idempotency is covered structurally. The description adds real value by disclosing that re-heartbeating the same phase intentionally does not clear stuck-ness and that a new phase resets the clock, but says nothing about lock expiry windows or failure 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?
Two short sentences with the purpose front-loaded and the phase caveat immediately after. Some residual indentation/backtick formatting is slightly noisy but nothing is wasted.
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?
With annotations covering idempotency and an output schema handling return values, the description covers the operational essentials an agent needs. Only lock-expiry timing and error conditions are left unaddressed.
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 100%, so owner, host_id and note are fully documented. The description's discussion of the phase parameter largely restates the schema's own note ('pass the same value to keep it, a new one to reset the clock'), adding only the stuck-ness framing, so baseline 3 applies.
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 ('Refresh your lock's heartbeat') and its goal ('so it doesn't go stale mid-task'), which distinguishes it from claim_host/release_host siblings. It doesn't explicitly name those siblings, which prevents 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?
Gives clear context for when to call (mid-task, to avoid a stale lock) and a concrete caveat about re-heartbeating the same phase versus reporting a new one. It stops short of explicitly naming alternatives like claim_host or release_host for lock lifecycle changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_assignBIdempotent
Set (or move) a queued job's host and queue order.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' | |
| position | No | Queue order (ascending); omit to keep the current |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, so the safety profile is covered. The description contributes the useful behavioral nuance that an existing assignment can be *moved*, but says nothing about what happens if the job is already running or what the prior host assignment becomes.
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 twelve-word sentence with the operation front-loaded and no filler. It is efficient bordering on terse; nothing is wasted, though the brevity pushes remaining burden onto the caller.
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?
With an output schema, full annotation coverage and complete parameter docs, the description is serviceable but thin. It omits preconditions (job must be queued, host must be claimed) and does not mention that setting position reorders surrounding jobs, which matters for a scheduling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter carries an example-bearing description, so the baseline is already met. The description adds a bit more by tying 'queue order' to the otherwise thin position parameter and framing assignment as movable.
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 concrete verb-and-resource pair: 'Set (or move) a queued job's host and queue order.' The 'queued' scoping separates it from job_start/job_cancel and the 'move' wording signals reassignment rather than creation. It stops short of naming a sibling to contrast with, so a 4 rather than 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?
The description gives no when-to-use, when-not, or alternative routing at all; the only hint is the adjective 'queued.' Nothing tells the agent to prefer job_enqueue for new work or claim_host for host-side reservation, leaving differentiation to inference from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_attachA
Copy a local file into the job's artifacts (MCP runs on the Mac). Append-only: no overwrite.
Images also record a screenshot event automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Stored name; default = the file's basename | |
| path | Yes | Local (Mac) file to copy into the job's artifacts | |
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| md5 | Yes | |
| url | Yes | REST path that serves the bytes, e.g. '/api/artifacts/j-1a2b3c4d/hud.png' |
| name | Yes | |
| size | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/non-idempotent profile, but the description adds real value beyond them: append-only with no overwrite, and the side effect that images auto-record a screenshot event. That explains the non-idempotency and a hidden write the agent would otherwise not anticipate.
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 short sentences, zero waste, with the core action front-loaded and the append-only constraint and side effect immediately after.
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?
With an output schema present and annotations covering the safety profile, the description supplies the key behavioral facts (append-only, image side effect). It is only slightly short on edge cases such as name collisions, file size limits, or failure behavior for a missing local path.
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 100%, so path and job_id are already documented in the schema with the same Mac-local framing. The description adds no detail on the optional `name` parameter (overriding the basename) and no format guidance beyond the schema, so the baseline 3 applies.
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?
Specific verb+resource: copies a local file into a job's artifacts, with the scope (MCP runs on the Mac) made explicit. It clearly distinguishes itself from add_evidence or write_addon_file by naming the destination as job artifacts, though it does not call out those siblings by name.
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?
Usage is implied rather than stated: attach a file to an existing job. There is no explicit when-to-use versus alternatives (add_evidence, job_link), nor any stated prerequisite that the job must already exist via job_enqueue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_cancelA
queued/running -> cancelled; the reason is recorded as a timeline event.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| reason | No | Why it was cancelled (recorded on the timeline) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, non-idempotent mutation, and the description adds real information beyond them: the allowed source states and the side effect that the reason lands on the job timeline. It does not say whether an already-running job is interrupted gracefully or what state the job ends in on rejection, so it is not a 5.
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?
One compact clause with the state transition front-loaded and the side effect second; nothing is wasted. It is arguably compressed to the point of omitting a needed precondition-failure clause, but every word present 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?
With an output schema, full parameter coverage, and safety annotations present, the definition is close to self-sufficient. The remaining gap is behavioral on the failure path: what happens when the job is not queued/running, and whether cancellation is immediate for a running job, is left unstated.
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 100%, so both job_id ('from job_enqueue/job_list') and reason are already documented; baseline 3 applies. The description only echoes the schema's note that the reason is recorded on the timeline rather than adding format, length, or default behavior.
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 encodes a precise state transition ('queued/running -> cancelled'), which tells an agent the operation and its precondition far better than the tool name alone, and the 'job' framing distances it from build_cancel. It stops short of any explicit sibling differentiation (job_finish, job_restatus), which keeps it from 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?
The precondition 'queued/running' implicitly defines when the tool applies, so usage is inferable rather than stated. There is no explicit statement of when-not-to-use it, no guidance on a job already finished or failed, and no named alternative for stopping work in other states.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_enqueueA
Enqueue a job (validated intake -> queued). The intake is the gate: every missing required field
comes back in one error with a field list. Set host_choice='ask' to queue unassigned.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | test | demo | final | |
| title | Yes | Human name (the HUD strip / banner label) | |
| branch | No | Branch under test | |
| commit | No | Commit sha under test | |
| origin | No | Who asked for this run: human | agent | driver | eval | probe | warmup (default agent). The learning loop reads the ledger by origin, so tag synthetic runs (driver/eval/probe/warmup) — an untagged repeat inflates a training artifact. | |
| reason | No | Why the run may exceed the 5-minute default | |
| target | Yes | What is under test: feature/test name + branch@sha | |
| cleanup | No | Things that must be gone at the end | |
| host_id | No | Host to queue on, or set host_choice='ask' | |
| purpose | Yes | One sentence: why this run exists | |
| expected | Yes | Pass criterion (an observable outcome) | |
| watching | No | The user is watching this run live | |
| project_id | No | Project this job belongs to | |
| host_choice | No | 'ask' = stays queued + unassigned until assigned | |
| max_minutes | No | Cap; test/demo default 5, larger needs `reason` | |
| screenshots | No | each_step (default) | on_request | none | each_step |
| requested_by | No | Coordinator session id | |
| needs_confirm | No | True = the human iso_confirm gate decides pass/fail |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses two real behaviors: validation is aggregate (all missing required fields surface in a single error with a field list) and 'ask' leaves the job queued and unassigned until picked up. It does not spell out that repeated calls create duplicate jobs despite idempotentHint=false, which would have earned a 5.
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 short sentences, front-loaded with the action and the state transition, then the two most operationally important facts. Nothing wasted.
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 an output schema and 100% schema description coverage, the description needn't restate returns or parameter syntax, and it correctly focuses on the intake-gate behavior. For an 18-parameter tool it is a little thin on which fields the gate actually enforces, but it is sufficient 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 100%, so the baseline is 3. The description's mention of host_choice='ask' and the 5-minute cap only restates what the schema already documents for those parameters; it adds no new semantics for the other 15 fields.
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?
A specific verb+resource ('enqueue a job') plus the state transition it performs ('validated intake -> queued'). An agent can distinguish it from the job_* siblings that consume/assign/finish jobs, though no sibling is named explicitly.
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 hints at the creation context ('the intake is the gate') and gives one operational hint ('host_choice=ask to queue unassigned'), but there is no explicit when-to-use / when-not, no naming of alternatives like job_assign or job_next, and no prerequisite guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_eventA
Append one timeline event. phase updates the job's current phase; error/crash require a
message and SHOULD carry data.log_tail so the job page can expand the failure in a .
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | JSON detail: log_tail (capped 64 KB) for error/crash, exit_code, url, md5, test_run_id | |
| level | Yes | ||
| phase | No | Sets the job's current phase when given | |
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| message | Yes | What happened (the timeline line) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| data | No | JSON detail: log_tail, exit_code, artifact url, md5, ... |
| level | Yes | |
| phase | No | |
| job_id | Yes | |
| message | Yes | |
| created_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, non-idempotent, non-destructive write. The description adds meaningful behavior: appending a timeline event, mutating the job's current phase when phase is provided, and supporting failure expansion via data.log_tail.
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 front-loaded, with no wasted text. It communicates the core operation and key conditional behavior efficiently.
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, and annotations cover the safety profile. The description supplies enough context for correct invocation, though it does not fully explain all event levels or the relationship to sibling job tools.
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 80%, so the schema already documents most parameters. The description reinforces phase and log_tail semantics, but adds limited meaning beyond the existing 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 uses a specific verb and resource: 'Append one timeline event' to a job. It clearly identifies the operation, but it does not explicitly differentiate this tool from related job tools such as job_restatus, job_verdict, or job_finish.
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 useful conditions for specific fields: phase updates the job's current phase, and error/crash events require a message and should carry data.log_tail. However, it does not state when to use this tool instead of the many sibling job tools or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_finishA
Close out a running/queued job. Gate: summary must carry what, why, learned and next, each
non-empty and <=600 chars; otherwise the call is rejected with the offending field names.
status='inconclusive' is the honest close-out for a run that ended without a pass/fail verdict
(a step-gated demo the user stopped answering) — it is NOT a pass.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| status | Yes | passed | failed | error | cancelled | inconclusive | |
| summary | Yes | Close-out summary, ALL FOUR required and <=600 chars each: {what, why, learned, next} |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only say readOnly=false and destructive=false. The description adds the validation rule: the call is rejected unless all four summary fields are non-empty and at most 600 characters, and the error names the offending fields. That is real behavioral detail beyond the annotations, but the description does not say what state the job ends in, whether the call can be retried, or that an idempotentHint of false means a second close-out fails.
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?
It is three short sentences and front-loads the core action before the validation gate. Each sentence carries information, though the parenthetical example of a stopped demo is slightly verbose for the space it takes.
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 need no prose, and the description covers the rules of the one mutation this tool performs. It explains the required summary shape, what happens on rejection, and the difference between inconclusive and passed, so nothing essential is missing for a correct 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 coverage is 100%, so the field descriptions already define job_id, status and the summary object. The description tells the caller more than the schema alone: the four summary keys are each subject to a non-empty and length check, and violation rejects the call; and it explains what status='inconclusive' actually means, which the schema only lists as an enum value.
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: 'Close out a running/queued job.' That distinguishes it from job_cancel, job_verdict and job_restatus by implication, but the description never names those siblings, so the agent must infer the boundary. Purpose itself 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?
It gives a clear condition for the 'inconclusive' status: a run that ended without a pass/fail verdict, such as a step-gated demo the user stopped answering, and explicitly says this is not a pass. How this tool relates to siblings such as job_verdict or job_cancel is not stated, so the caller must infer when to use this tool rather than one of those.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_getBRead-onlyIdempotent
One job with its full timeline (events), links to test runs/builds/deploys/evidence and artifacts.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered. The description adds useful content beyond that by saying the payload is a 'full timeline' plus cross-entity links and artifacts, i.e. it is a heavyweight detail fetch rather than a summary. It says nothing about size, pagination, or behavior when the job id doesn't exist.
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?
One front-loaded sentence with no filler — the important part (full detail incl. events/links/artifacts) comes first. It reads as a sentence fragment, which is efficient but slightly telegraphic.
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?
With an output schema present, the description needn't explain return values, and annotations cover safety; what remains is adequate for a one-parameter read tool. The main shortfall is absent guidance on when to prefer it over job_list or job_event.
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 100% and the single job_id parameter is already documented with a format example ('j-1a2b3c4d') and provenance. The description adds no additional meaning to the parameter, so the baseline 3 applies.
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 the resource ('One job') and enumerates what the response carries — timeline events, links to test runs/builds/deploys/evidence, and artifacts — which is specific enough to separate it from job_list's collection view. The verb is only implied ('One job with...'), so it stops short of a clean verb+resource phrasing.
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 sentence tells the agent when to reach for this versus job_list, job_event, or job_screenshots. The only routing hint ('Job id from job_enqueue/job_list') lives in the schema, not the description, so the description itself gives no usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_linkBIdempotent
Attach a canonical record the job is about (a test run, build, deploy, evidence row or project).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | test_run | build | deploy | evidence | project | |
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| ref_id | Yes | Id of the test run / build / deploy / evidence / project |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is already covered. The description adds which record kinds may be linked, but does not explain whether linking replaces prior links, requires the job to exist, or what happens on duplicate links.
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 with no wasted words. It could be slightly sharper by naming the alternative tool, but it is efficiently sized.
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?
All three parameters are documented and an output schema exists, so return values need not be described. However, the unresolved relationship to job_attach and the lack of guidance on duplicate or replacement behavior leave gaps for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents job_id, kind, and ref_id in detail. The description's parenthetical list of record kinds duplicates the schema's kind field rather than adding new meaning, so baseline 3 is appropriate.
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 (attach) and resource (a canonical record such as test run, build, deploy, evidence, or project) tied to a job. The purpose is clear, but it does not distinguish itself from the sibling tool job_attach, leaving ambiguity about which one to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives, notably job_attach and add_evidence, both of which sound closely related. There is no mention of prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_listBRead-onlyIdempotent
Jobs newest first. status='active' means queued + running. Each row carries error/crash counts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | A status, or 'active' = queued+running | |
| host_id | No | Restrict to one host |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, so the description rightly spends its words elsewhere: default ordering (newest first), the aggregation semantics of status='active' as queued+running, and that rows include error/crash counts. It does not mention pagination or how truncation at the 500 limit behaves, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses with no waste, though it leads with sort order rather than the core 'lists jobs' purpose, and the telegraphic fragments are slightly less parseable than a single explicit sentence would be.
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?
With annotations covering safety and an output schema covering return shape, only filter/paging behavior remains, and the description leaves limit and host_id wholly to the schema. Adequate but with a visible gap for an agent deciding how to page or filter.
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 67%; the description explains the 'active' value but that merely restates the status parameter's own schema description, and it says nothing about limit (default 100, max 500) or host_id filtering. Baseline 3 applies since the schema carries most of the parameter semantics.
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 name plus 'Jobs newest first' makes clear this returns a list of jobs, and the ordering and per-row error/crash counts distinguish it from single-job siblings like job_get. It never states a verb like 'list' explicitly, but the resource and output shape are 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 statement of when to use this versus job_get, job_next, or the build/deploy listing tools, and no prerequisites or exclusions. An agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_nextARead-onlyIdempotent
The head queued job for a host, only when that host's lease is free. Errors (with the holder) when a fresh lock blocks it, and when the host's queue is empty.
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds genuinely new behavior: it errors when a fresh lock is held (including the holder) and when the queue is empty. That is useful failure-mode context beyond the annotations; only the return shape is left unstated, which the output schema covers.
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 tight sentences, with the core behavior front-loaded and the error conditions following. Every clause carries information about preconditions or failure modes; nothing is redundant.
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?
With annotations covering safety/idempotency and an output schema covering return values, the description supplies the missing pieces: the lease precondition and both error paths. Minor gap: it never clarifies in prose that the call does not claim or dequeue the job, leaving that inference to the readOnlyHint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema coverage, including an example value and a pointer to list_hosts. The description adds no parameter-level meaning, so the baseline of 3 applies since the schema carries the burden.
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 names a specific resource and scope: 'the head queued job for a host', which distinguishes it from job_list (all jobs) and job_get (a specific job). It stops short of explicitly naming those siblings, so the differentiation is inferable 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 precondition 'only when that host's lease is free' implies when to call it, and the error conditions hint at when not to. But there is no explicit routing guidance against job_list, job_get, job_assign, or job_start, leaving the agent to infer which tool retrieves versus claims work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_request_screenshotA
Ask the runner for a screenshot: an info event plus params.pending_shot=true. The runner
polls the job and answers by uploading an artifact, which clears the flag.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | What to capture, e.g. 'the HUD after the wall test' | |
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, giving the safety/mutation profile. The description adds meaningful context beyond that: this sets a pending flag, the runner polls and answers asynchronously by uploading an artifact, and the flag clears. This discloses the async/non-immediate nature, which is valuable behavioral detail.
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 purpose followed by the mechanism. Dense but efficient; nearly every clause carries actionable information about the async flow.
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 annotations cover safety, so the description carries less burden. It explains the async request/flag/artifact cycle well, but does not explicitly tell the agent how or where to retrieve the uploaded artifact afterward (e.g., via job_screenshots), a small gap for an async tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both job_id and note are already documented in the schema (including an example format). The description references `params.pending_shot=true` as part of the mechanism but adds no meaning to the actual input parameters beyond the schema. Baseline 3 applies.
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+resource: 'Ask the runner for a screenshot.' An agent understands this requests a new capture rather than listing existing ones. It does not explicitly distinguish itself from the sibling job_screenshots (which presumably lists captured screenshots), leaving that distinction to inference.
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?
Usage is implied through the mechanism description (info event + pending_shot flag), but there is no explicit when-to-use guidance and no routing to alternatives like job_screenshots for retrieving the result. The agent must infer the workflow context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_restatusA
Correct a FINISHED job's terminal status (terminal -> terminal), for a mis-recorded close-out
— e.g. a run that finished 'passed' but never got a verdict. reason is mandatory and lands as a
milestone timeline event. The job must already be terminal (a queued/running job finishes or is
cancelled) and the target must differ from the current status, else the call is a conflict.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| reason | Yes | Why the ledger is being corrected (recorded on the timeline) | |
| status | Yes | passed | failed | error | cancelled | inconclusive |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, idempotent=false, destructive=false) by disclosing the write's side effect (the mandatory `reason` is written as a `milestone` timeline event) and the failure mode (invalid preconditions produce a conflict). This tells an agent exactly what mutation it is committing and why a call would be rejected.
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, zero filler, with the core action and its terminal->terminal scope front-loaded before the example. Every clause carries information the agent needs: use case, side effect, precondition, and error behavior.
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 3-parameter mutation with annotations and an output schema, the description covers everything an agent must know before calling: preconditions, side effects, conflict behavior, and the correction intent. Return values are left to the output schema, as appropriate.
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 100%, so the baseline is 3, but the description earns more: it makes `reason` semantically meaningful (it becomes a milestone timeline event) and constrains `status` with the must-differ-from-current rule, which the schema does not state. It does not enumerate the accepted status values itself, relying on the schema for that.
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 precise verb and resource: correcting a FINISHED job's terminal status, with the 'terminal -> terminal' scope made explicit. It is clearly distinguished from job_finish and job_cancel, which handle queued/running jobs, and the example ('finished passed but never got a verdict') pins down the exact use case.
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 clear when-to-use ('mis-recorded close-out') and when-not ('a queued/running job finishes or is cancelled'), plus two hard preconditions: the job must already be terminal and the target status must differ from the current one. It routes by condition rather than by naming job_finish/job_cancel directly, so the alternative is implied rather than explicitly named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_screenshotsARead-onlyIdempotent
A job's screenshots tied to their step and verdict (seq, step, reason, url, web_url, verdict,
dimensions) — the image context a reviewer pulls after a run. Filter by step/reason.
| Name | Required | Description | Default |
|---|---|---|---|
| step | No | Filter by step id ('s4'); 'unassigned' = untagged | |
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| reason | No | ready | periodic | verdict | request | verify |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, closed-world behavior, so the safety profile is covered. The description adds that results are tied to step and verdict and are reviewer-facing, but says nothing about ordering (seq is listed but not explained) or result volume 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 compact sentences, front-loading the resource, field list and the filtering capability. The parenthetical field enumeration is dense but earns its place by previewing the payload.
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 exposition is optional, and the description still gives a useful field preview. For a single-required-param read tool with full schema coverage and annotations, nothing an agent needs in order to call it 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 coverage is 100% and the schema descriptions are richer than the prose (e.g. 's4', 'unassigned', the reason vocabulary). The description's 'Filter by step/reason' adds no detail beyond the schema, so baseline 3 applies.
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?
Names a specific resource (a job's screenshots) with the fields returned and the step/verdict association, so the agent knows this is a retrieval of captured imagery. It does not explicitly contrast with the nearby job_request_screenshot, leaving sibling differentiation 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 image context a reviewer pulls after a run' implies post-run review usage, and 'Filter by step/reason' hints at narrowing. But there is no explicit when-to-use versus job_request_screenshot (which creates a capture) or when not to filter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_startB
queued -> running, recording the worker and started_at. A second call is a conflict.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| worker | Yes | Subagent id / branch running it, e.g. 'ws/occluder-wire' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the bar is lower, yet the description still adds real behavioral content: the source state (queued), the fields written (worker, started_at), and that a repeat call errors rather than no-ops. It stops short of saying what happens if the job is not queued (error vs. overwrite) or what the response contains.
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 filler, with the transition front-loaded. The telegraphic 'queued -> running' fragment is efficient but drops the subject, which costs a little immediate readability for a first-time reader.
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 and annotations cover the safety profile, so much of the burden is lifted. Still missing for a state-mutating tool in a dense job-tool cluster: the failure mode for a non-queued job, and any pointer to which sibling handles the adjacent steps.
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 100% — both job_id (with format example and provenance from job_enqueue/job_list) and worker (with a concrete id example) are fully documented in the schema. The description adds nothing about parameters, so the baseline 3 applies.
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 the state transition ('queued -> running') and what gets recorded, but it omits an explicit verb+object framing and never distinguishes this from the many adjacent job tools (job_assign, job_next, job_attach, job_restatus). An agent reading the name plus this line can infer 'start a queued job', but the sibling boundary is left entirely unstated.
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?
'A second call is a conflict' is a genuine when-not constraint that steers the agent away from repeated invocation. However, there is no positive guidance on when to pick job_start over job_assign or job_next, and no stated precondition that the job must still be queued for the call to succeed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_verdictA
Answer the running job's current step with a human verdict (pass | fail | skip). Writes a
human-confirm evidence row through the same path as POST /api/evidence (so the confirm push
files fire) and appends a milestone event. The job must be running and link a test run, else
the call is a conflict.
| Name | Required | Description | Default |
|---|---|---|---|
| step | No | Step id/phase the verdict answers (optional) | |
| notes | No | Free-text note recorded with the verdict | |
| job_id | Yes | Job id from job_enqueue/job_list, e.g. 'j-1a2b3c4d' | |
| source | No | Where the verdict came from: 'coordinator' when relaying one the user typed in the Hermes chat, else chat | console | key | web | web |
| verdict | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| links | No | |
| phase | No | |
| title | Yes | |
| events | No | |
| origin | No | Who asked for this run (human | agent | driver | eval | probe | warmup) — scopes the learning loop |
| params | No | Intake: purpose, expected, caps, flags, pending_shot, ... |
| status | Yes | |
| target | Yes | |
| worker | No | |
| host_id | No | NULL = not yet assigned (host_choice='ask') |
| summary | No | Present once the job is closed out |
| web_url | No | Absolute URL of this job's page in the web UI |
| position | No | |
| artifacts | No | |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| crash_count | No | crash-level events (the queue board flags these) |
| error_count | No | error-level events (the queue board flags these) |
| finished_at | No | |
| current_step | No | The step awaiting a verdict (newest prompt event + whether it is answered) |
| requested_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses exactly what gets written (a human-confirm evidence row via the same path as POST /api/evidence, which triggers confirm push files, plus a milestone event) and what failure state to expect (conflict when the job is not running or has no linked test run). This is precisely the mutation-side context the readOnly/destructive hints cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the action front-loaded, then mechanics, then the failure precondition. The parenthetical about confirm push files is jargon but load-bearing for anyone reasoning about side effects. Nothing is redundant with the title or schema.
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 shape need not be described, and the description covers the mutation's side effects and validity gate. What is left implicit is repeat behavior — the annotation declares non-idempotency, but the description doesn't say whether re-submitting a verdict for the same step is allowed or errors.
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 80%, so the schema already explains step, notes, job_id, source, and the verdict enum — including the non-obvious 'coordinator' source convention. The description adds no per-parameter meaning (e.g. what makes a step id valid, or how a re-answer on the same step behaves), so the baseline 3 applies.
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: answering a running job's current step with a pass/fail/skip verdict. It also distinguishes the mechanics from plain evidence recording by naming the POST /api/evidence path. It stops short of explicitly contrasting with the closest siblings (job_event, job_finish, add_evidence), which an agent must infer.
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 supplies a hard precondition — the job must be running and linked to a test run, otherwise conflict — which effectively tells the agent when this call is valid. However, it never names an alternative for the adjacent cases (e.g. use job_event for a non-verdict event, job_finish to close the job), so the routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_addonsBRead-onlyIdempotent
List addons in the local workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so safety and repeatability are covered structurally. The description's only added behavioral fact is the "local workspace" scope, which hints that results are limited to on-disk/workspace addons rather than remote ones — useful but thin. Nothing is said about whether the optional game filter narrows results or how many addons come back, though the presence of an output schema reduces that burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero filler. It is not bloated, but the brevity borders on under-specification given the tools around it.
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 (one optional parameter, annotations present, output schema present), so the description does not need to explain return values. However, it omits whether listing is filtered by the 'game' default and how this relates to get_addon, which is the main remaining gap.
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 100%: the single 'game' parameter is documented inline with its allowed values (cs2, deadlock) and a default. The description adds nothing about how filtering behaves when 'game' is omitted, so the baseline 3 applies.
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 and resource ("List addons") plus a scope qualifier ("local workspace"), so the agent knows exactly what is returned. It does not differentiate from nearby siblings such as get_addon or list_projects, leaving the agent to infer which of several listing/lookup tools fits.
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 statement of when to call this versus get_addon, read_addon_file, or scaffold_addon, and no mention of prerequisites or the typical list-then-get flow. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_convarsBRead-onlyIdempotent
List console variables/commands, filtered by substring and/or flag.
| Name | Required | Description | Default |
|---|---|---|---|
| flag | No | Only entries with this flag, e.g. 'cheat' | |
| game | Yes | Game id: one of cs2, deadlock | |
| kind | No | ||
| limit | No | ||
| query | No | Substring of name or description | |
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| limit | Yes | |
| total | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds only the filtering behavior; it says nothing about result caps (limit max 200), pagination via offset, or what is returned, though an output schema covers returns.
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 with zero filler. It is efficient, though its brevity is partly the cause of the missing usage context rather than a sign of disciplined trimming.
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?
With 6 parameters, 50% schema coverage, an output schema and a 1-required-param contract, the description leaves pagination and the convar/command 'kind' switch unexplained. Return values need not be described given the output schema, but pagination behavior is a real gap.
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 50%: flag, game and query are documented in the schema, and the description reinforces query as a substring match and flag filtering. It adds no meaning for kind, limit or offset, which are undocumented in both places, so it only marginally compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List console variables/commands') plus the filtering axes, which lets an agent distinguish it from get_convar (single lookup) without opening the schema. It does not explicitly name the sibling, 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?
The filtering phrasing implies a discovery/browse use case and implicitly contrasts with get_convar, but there is no explicit when-to-use or when-not-to-use statement and no mention of prerequisites such as the required game id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docsARead-onlyIdempotent
Browse community documentation pages (titles, URLs) without bodies.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id; general Source 2 pages are always included | |
| limit | No | ||
| query | No | Substring of title or path |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| limit | Yes | |
| total | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered, and the output schema covers the return shape. The description adds the useful fact that page bodies are excluded (light payload), but says nothing about ordering, pagination limits, or whether game scoping expands or narrows results.
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 with zero filler; the payload constraint is stated immediately after the purpose, so no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with an output schema, annotations, and mostly documented params, the definition covers purpose and payload scope adequately. Minor gaps remain around pagination/ordering and the game-scoping behavior, which an agent would have to infer from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% and the description adds no parameter-level meaning — nothing about how 'game' merges general Source 2 pages (which is only in the schema), how 'query' matches, or how 'limit' affects listing. Baseline 3 applies since the schema carries most of the burden.
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 ('Browse community documentation pages') and parenthetically defines the return shape (titles, URLs), which cleanly separates it from a body-fetching tool like get_doc. It does not explicitly name search_docs or get_doc, so the sibling differentiation is only implied via 'without bodies'.
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?
'Without bodies' implies the alternative (fetch the page itself with get_doc) for the case where content is needed, but no explicit when-to-use or when-not-to-use guidance is given, and nothing distinguishes browsing from search_docs + query filtering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_evidenceARead-onlyIdempotent
List evidence rows (newest first), optionally filtered by project, step and/or kind.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| step_id | No | Restrict to one step | |
| project_id | No | Restrict to one project |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context with the 'newest first' ordering, but says nothing about result limits, pagination, or what happens when multiple filters are combined.
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 with zero filler: verb, resource, ordering, and filter surface are all in the first clause.
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?
With an output schema present and annotations covering safety, the description supplies what an agent needs to call it: what it returns, in what order, and how to narrow. Missing only edge details like result caps or behavior when no filters are given.
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 67% and the description names all three filters and signals they are optional and combinable ('and/or'), which is a mild addition. However, it does not explain the kind enum values (console_transcript, file_hash, pixel_diff, etc.) or whether project/step scoping is required for meaningful results.
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 ('List evidence rows'), plus the default ordering (newest first) and the available filters. It does not explicitly distinguish itself from the write-side sibling add_evidence, 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?
'optionally filtered by project, step and/or kind' implies the retrieval use case and that all filters are combinable, but there is no explicit when-to-use/when-not guidance or pointer to alternatives such as add_evidence for writing or any detail-oriented get tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_examplesARead-onlyIdempotent
List example scripts (Valve's cs_script_demo samples) with the API each one uses.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and closed-world scope, so the safety profile is covered. The description adds only that the samples are Valve-authored demo scripts; it says nothing about result volume, ordering, or how the 'API used' field is presented beyond 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?
One front-loaded sentence with no filler; the scope qualifier follows the core statement rather than burying it.
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 need no prose, and the lone parameter is fully documented in the schema. The only real gap is the unstated relationship to get_example, which an agent would have to infer.
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 100% and the single 'game' parameter already documents its allowed values (cs2, deadlock) and default. The description adds no meaning about the filter, so baseline 3 applies.
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?
Specific verb plus resource ('List example scripts') with the source scope named ('Valve's cs_script_demo samples') and what's returned per item ('the API each one uses'). It does not distinguish itself from the sibling get_example, so an agent can't tell from this text alone why to list rather than fetch one.
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 listing purpose implies a discovery-then-fetch workflow, but the description never says to call get_example afterwards or when this tool is preferable to it. No exclusions, prerequisites, or coverage statement (whether the list is complete or paginated).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_game_eventsBRead-onlyIdempotent
List game events, optionally filtered by a substring of the name or description.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| limit | No | ||
| query | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| limit | Yes | |
| total | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and closed-world, so the safety profile is covered. The description adds that the query filter is a substring match on name or description, which is real behavioral context, but says nothing about paging semantics (default 100, cap 200, offset ordering) that materially affect how results come back.
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 with no filler; the filtering behavior is stated up front. It is a touch thin for a 4-parameter list tool, but there is no verbosity to trim.
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 shape needn't be explained. Still, the description leaves paging (limit/offset interaction, max magnitude) and sibling disambiguation against get_game_event/list_games unaddressed, which an agent needs to call this correctly in a crowded tool namespace.
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 only 25% – solely 'game' is documented in the schema. The description supplies the missing meaning for 'query' (substring over name/description), which is valuable, but 'limit' and 'offset' remain completely undescribed in both schema and description, so it only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List game events') plus the filter capability, so an agent knows what it returns. However, it never distinguishes itself from the sibling 'get_game_event' (single event) or 'list_games', leaving the selection boundary 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?
No when-to-use or when-not-to-use guidance. The description does not point to 'get_game_event' for fetching one event by id, nor does it say the list is scoped to a game via the required 'game' param. Usage is only inferable from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gamesARead-onlyIdempotent
List supported games with their currently indexed build and patch version.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds that results reflect the 'currently indexed' build and patch version, hinting the data is a snapshot, but it does not say how that snapshot is populated or that it may lag behind actual builds.
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 sentence with zero filler that front-loads the primary purpose and appends the useful detail about returned fields. There is nothing to trim.
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?
With an output schema present, return-value details need not be spelled out, and a zero-parameter read-only list tool has a low bar. The only gap is scope: it does not clarify whether 'supported games' means all known titles or only those with indexed data in this workspace.
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 takes zero parameters, so there is no parameter semantics to document and the baseline of 4 applies. Nothing in the description conflicts with the empty 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?
Specific verb ('List') plus resource ('supported games') and it goes further to name what each entry carries ('currently indexed build and patch version'). It does not distinguish itself from siblings like build_list or server_info, but the resource is unambiguous enough that an agent can tell 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?
Usage is only implied: this is evidently a discovery/enumeration call an agent would use before touching build or deploy tools. There is no explicit when-to-use statement, no mention of alternatives such as build_list for a single game's builds, and no prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_hostsARead-onlyIdempotent
List registered test/build hosts with their facts (shell, GPU, paths) and current lock state.
CHECK THIS before driving any host: a fresh lock means another session/workstream owns it.
Each lock carries phase (what the owner is doing), phase_age_sec and stuck — the SERVER
marks a lock STUCK when its heartbeat is fresh but the phase has not moved past the configured
threshold (liveness is not progress). Treat lock.stuck=true as "the owner may be hung".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, openWorldHint=false), so the bar is lower; the description still adds real value by explaining that `stuck` is computed server-side from heartbeat freshness versus phase movement, and that `lock.stuck=true` means the owner may be hung. That is interpretation the schema cannot convey. It stops short of covering empty-list behavior or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is listed, then the call-to-action, then the interpretation rule. Every sentence earns its place; the parenthetical field list and backticked field names are compact. Slightly dense line-wrapping, but no redundant restatement of the name.
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?
With an output schema present and no parameters, the description only needs to cover purpose and how to act on results — which it does, including the non-obvious stuck-lock heuristic. Only minor gaps remain (whether an empty host list is possible, and which tool to use once a lock is detected).
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 takes zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description instead spends its space on the semantics of returned lock fields, which is appropriate.
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?
Specific verb + resource ('List registered test/build hosts') plus an explicit statement of what is returned: facts (shell, GPU, paths) and current lock state. An agent can distinguish this from get_host (single host) or claim_host (acquire) without consulting 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?
'CHECK THIS before driving any host' gives an explicit pre-condition for calling, with the rationale (a fresh lock means another session/workstream owns it). It does not name the concrete alternative calls (get_host, probe_host, claim_host) an agent might use once it sees a lock, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsBRead-onlyIdempotent
List orchestration projects (most recently updated first).
| Name | Required | Description | Default |
|---|---|---|---|
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and closed-world, so the safety profile is covered. The description adds one genuinely useful behavioral fact — results are ordered most-recently-updated first — but says nothing about result volume, truncation, or pagination for what could be a long list.
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 tight sentence with the ordering fact front-loaded and no filler. It is arguably too terse rather than bloated, which is a completeness problem, not a conciseness one.
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 explanation isn't needed, and annotations cover safety. However, for a filtered list tool the missing pieces are the meaning of the `status` filter and any indication of pagination or result limits — both are absent.
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 carries the burden of explaining `status`, and it never mentions the parameter at all. The enum values (active/done/abandoned) are self-explanatory, but the description doesn't confirm that status filters the list or that omitting it (null default) returns all projects.
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+resource ("List orchestration projects") plus the ordering guarantee, which is enough to distinguish it from siblings like get_project or list_workflows. It doesn't explicitly contrast itself with those siblings, 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?
Listing semantics imply when to call it, but there is no explicit guidance on when to use this versus get_project (single project) or job_list/build_list, nor any note on whether it's paged or bounded. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_schema_classesBRead-onlyIdempotent
List schema classes/enums by name substring, module, kind or declared field.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| kind | No | ||
| limit | No | ||
| query | No | Substring of the class name | |
| module | No | ||
| offset | No | ||
| has_field | No | Only classes that declare this field |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| limit | Yes | |
| total | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds the filterable dimensions but says nothing about pagination behavior despite limit/offset existing.
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 names the action and all filters with zero padding.
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 and annotations are present, covering return values and safety. However, with 7 params and only 43% schema coverage, the description should clarify pagination and the undifferentiated parameters to be 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 coverage is only 43%, but the description compensates by naming the filter axes (name substring, module, kind, declared field). It leaves limit/offset pagination semantics and the game enum unaddressed, so it partially but not fully closes the 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?
States a specific verb (list) and resource (schema classes/enums) with the filter axes named. An agent can distinguish it from the singular get_schema_class sibling by name, though it does not explicitly contrast them.
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?
Usage is implied by 'List ... by ...' but there is no explicit guidance on when to use this versus get_schema_class, nor any prerequisites or exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_script_typesARead-onlyIdempotent
List every top-level cs_script type: the Instance const, classes, interfaces, enums and type aliases.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered. The description still adds real value by scoping results to 'top-level' types and calling out that the Instance const is included — a non-obvious inclusion that affects result interpretation.
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?
One sentence, zero filler, with the scope qualifier ('top-level') front-loaded before the enumeration. Nothing is padded or redundant.
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 need no explanation, and the single optional parameter is handled by the schema. What's missing is routing guidance relative to the many sibling lookup tools, which would make the definition 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 coverage is 100% and the single optional 'game' parameter is fully documented in the schema (default cs2, allowed values). The description adds nothing about the parameter, so baseline 3 applies — the schema does all the work.
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 ('List') and a precise resource ('every top-level cs_script type'), then enumerates what that covers: the Instance const, classes, interfaces, enums, aliases. An agent immediately knows what comes back, though it doesn't explicitly distinguish this from neighbors like get_script_api or list_schema_classes.
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?
Usage is only implied — an agent would infer this is the discovery entry point before calling get_script_api. There is no statement of when to prefer it over the adjacent schema/doc lookup tools, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_test_runsBRead-onlyIdempotent
Recent test sessions (newest first), optionally filtered by state.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Restrict to one state |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds the meaningful extra that results come back newest-first, but leaves unexplained how many 'recent' sessions are returned and whether there is an implicit cap — relevant because there is no paging parameter.
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?
One short sentence with the ordering and filter front-loaded and no wasted clauses. The only weakness is that 'Recent' is left undefined, making the sentence underspecified rather than 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?
An output schema exists, so return shape needn't be explained. For a single-optional-param list tool the essentials are present, but the undefined result window ('recent') matters because the schema offers no limit/offset control, leaving the agent unable to predict result volume.
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 100%, so the single optional 'state' parameter is already fully documented including its enum. The description's 'optionally filtered by state' adds the fact that omitting it returns all states, plus the newest-first ordering, which is a small but real increment over 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?
States a specific verb-and-resource pair implicitly: lists 'test sessions' with a stated ordering ('newest first') and an optional state filter. An agent can distinguish it from siblings like test_status or test_start by the plural collection noun, though the description never names those siblings explicitly.
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?
'Optionally filtered by state' implies the browsing/history use case, but the description gives no explicit when-to-use versus alternatives such as test_status (current run) or list_evidence, and no statement of when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workflowsARead-onlyIdempotent
List orchestration workflows: multi-step recipes (research → design → build → validate → test → document) that chain this server's tools and prompts. Start one with start_project.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Filter by game id |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by explaining that workflows chain this server's tools and prompts, though it does not discuss result size or pagination.
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 core purpose and followed by the concrete next action. There is no wasted text.
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 read-only annotations, fully described single optional parameter, and available output schema, the description supplies everything needed to call this tool correctly. It defines what a workflow is and points to 'start_project' for the next step.
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 100% description coverage and documents the single optional 'game' parameter as 'Filter by game id'. The description does not add any parameter-specific meaning beyond that, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List orchestration workflows') and immediately explains that these are multi-step recipes chaining the server's tools and prompts. It also names the sibling 'start_project' as the way to begin one, so it is distinguishable from related workflow tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly indicates the follow-up action: use 'start_project' to start a listed workflow. The intended flow is easy to infer, though it does not explicitly state when not to use this tool or contrast it with other discovery tools like 'search_docs'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_stepARead-onlyIdempotent
Get the ready step(s) of a project: instructions, tools to use, rendered prompt text and the gate the server will check when the step is marked done.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id from start_project, e.g. 'p-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| game | Yes | |
| goal | Yes | |
| addon | No | |
| title | Yes | |
| status | Yes | |
| guidance | Yes | |
| progress | Yes | |
| next_steps | No | |
| project_id | Yes | |
| blocked_steps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context — that the response includes the server-side gate that will be validated on completion — but omits the key edge case: what is returned when no step is ready (empty vs error).
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?
One sentence, verb-first, with the returned content front-loaded as a compact list. No filler and nothing repeated from the schema or title.
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 the description needn't document return shapes, and with one fully documented required parameter the call mechanics are clear. The only real omission is the no-ready-step behavior, which matters for a 'next' style tool an agent may poll.
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 100% and the single parameter is documented with its provenance and format ('Project id from start_project, e.g. p-1a2b3c4d'). The description adds nothing beyond the schema, which is the expected baseline given full 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?
States a specific verb and resource ('Get the ready step(s) of a project') and enumerates the payload: instructions, tools, rendered prompt text, and the completion gate. This distinguishes it well from get_project (project metadata), update_step (mutation), and get_prompt_text. It stops short of naming a sibling it is explicitly not, so 4 rather than 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?
Sequencing is implied: this is the step you fetch before doing work, and the description hints that the returned gate matters 'when the step is marked done', implying a later update_step call. However, no explicit when-to-use/when-not or alternative tool is named, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
probe_hostAIdempotent
SSH to the host, run the probe script (GPU, RAM, processes, CS2 path/build) and store the facts. Use before planning work on a host — e.g. to see if a game or a heavy GPU process is running.
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| os | No | |
| lock | No | |
| facts | No | Probed facts (gpu, ram, node_path, cs2_path, ...) |
| notes | No | |
| shell | No | |
| ssh_key | No | |
| hostname | No | |
| probed_at | No | |
| ssh_target | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, open-world, idempotent, non-destructive; the description adds the missing context that explains those hints — it opens an SSH connection to a remote machine and persists the collected facts. The only gap is that it doesn't say whether a new probe overwrites prior stored facts or how unreachable hosts are handled.
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: the action and its outputs come first, the usage trigger second. No filler, no redundancy with the schema.
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?
With an output schema present, the description doesn't need to describe return values, and it covers the mechanism, data collected and invocation trigger adequately. What's missing is the persistence semantics (does it write into the host record consumed by get_host / claim_host decisions?) and failure behavior for an offline host.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage, and the schema already supplies the origin of the value ('Host id from list_hosts, e.g. build-pc'). The description adds nothing about the parameter, so the baseline 3 applies.
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?
It gives a concrete verb chain (SSH, run probe script, store facts) plus an explicit enumeration of what is probed (GPU, RAM, processes, CS2 path/build), which is far more specific than a name restatement. It doesn't explicitly contrast itself with the closest sibling, get_host, which likely returns the already-stored facts.
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 states the timing and motivation clearly: 'Use before planning work on a host — e.g. to see if a game or a heavy GPU process is running.' That is genuine when-to-use guidance, but there is no when-not (e.g. reuse stored facts via get_host instead of re-probing) and no cost/latency warning about SSH round trips.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_addon_fileBRead-onlyIdempotent
Read a text file from an addon in the workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
| name | Yes | Addon name: lowercase [a-z0-9_], e.g. 'jump_arena' | |
| path | Yes | Path inside the addon, e.g. 'scripts/jump_arena.js' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds only the scope constraint ('from an addon in the workspace') and the text-file restriction; it says nothing about behavior on missing files, size or encoding limits, or path traversal rules.
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?
One short sentence with the resource and scope front-loaded and no filler. It is efficient, though spare enough that it borders on under-specified rather than merely concise.
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 need not be described, and annotations carry the read-only safety profile. Still, for a tool resolving a game plus addon plus path, the description leaves error conditions and any constraints on the requested path unaddressed.
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 100%, with each parameter ('game', 'name', 'path') documented including format examples, so the baseline is 3. The description adds no parameter meaning beyond what the schema already provides.
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: read a text file from an addon in the workspace. This naturally separates it from write_addon_file and get_addon, though it never names those siblings explicitly.
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 instead of get_addon, list_addons, or write_addon_file, nor any note about prerequisites such as the addon existing or the file being text rather than binary. The use case is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_hostAIdempotent
Register (or update) a test/build host. Upsert: omitted fields keep their previous values.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | e.g. 'windows' | |
| notes | No | ||
| shell | No | Login shell flavor on the host | |
| host_id | Yes | Short id: lowercase [a-z0-9-], e.g. 'build-pc' | |
| ssh_key | No | Identity file path if not the ssh default | |
| hostname | No | Machine name, e.g. 'DESKTOP-BUILDPC' | |
| ssh_target | Yes | ssh alias or user@host, e.g. 'rtx-pc' or 'pompa@192.0.2.172' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| os | No | |
| lock | No | |
| facts | No | Probed facts (gpu, ram, node_path, cs2_path, ...) |
| notes | No | |
| shell | No | |
| ssh_key | No | |
| hostname | No | |
| probed_at | No | |
| ssh_target | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that by spelling out upsert semantics: 'omitted fields keep their previous values,' which tells the agent that a partial payload will not wipe existing host config. It does not address permissions, conflicts on re-registering an existing host_id, or error behavior, so it is not a 5.
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 short sentences, zero filler, and the core purpose is front-loaded before the upsert caveat. Every clause 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?
For a 7-parameter upsert with an output schema and 86% schema coverage, the description supplies the one piece of semantics the schema cannot express: partial-update retention. An agent has enough to call it correctly. It could go further on re-registration conflicts or required prerequisites, but nothing essential 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 86%, so the schema already documents host_id format, ssh_target form, shell enum, ssh_key path, hostname, and os. The description adds only the cross-parameter rule that omitted fields retain prior values, which is useful but does not enrich individual parameters. Baseline 3 is appropriate when the schema carries the parameter burden.
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 names a specific verb pair and resource: 'Register (or update) a test/build host.' That distinguishes it from read-side siblings like list_hosts and get_host and from lifecycle siblings like claim_host and release_host, since it is clearly the create/upsert path. It stops short of naming those siblings explicitly, which keeps it at 4 rather than 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 parenthetical '(or update)' implies the tool is the entry point for getting a host into the registry, so an agent can infer it should call this before claim_host or probe_host. However, no explicit when/when-not guidance is given, and no sibling is named as an alternative. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_hostAIdempotent
Release a host lock. Always call this when finished with a host.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Release another owner's lock (cleanup of dead owners) | |
| owner | Yes | Who is asking: workstream/session id, e.g. 'ws/occluder-wire', 'p-1a2b3c4d', 'coord-session' | |
| host_id | Yes | Host id from list_hosts, e.g. 'build-pc' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so safety and repeat-call behavior are covered. The description adds the lifecycle obligation ('always call when finished') but says nothing about what happens on a lock owned by someone else, whether the release fails, or how it interacts with force cleanup.
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 short sentences, action first and the lifecycle instruction second. Nothing superfluous.
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?
A low-complexity lock-release tool with full schema coverage, safety annotations and an output schema; the description tells the agent what it does and when to call it. Only edge-case behavior (non-owner release, forced cleanup outcomes) is left unstated.
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 100%, including examples for owner and host_id and an explanation of force, so the schema carries the parameter burden. The description adds no parameter-level meaning beyond that baseline.
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+resource ('Release a host lock') that is clearly distinct from siblings like claim_host, register_host and heartbeat_host. It does not explicitly name the counterpart sibling, but the action 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?
'Always call this when finished with a host' gives a concrete lifecycle trigger for use. It stops short of stating exclusions (e.g., only the lock owner may release, or use force for dead owners), which the schema covers only implicitly via the force parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scaffold_addonA
Create a new addon in the local workspace (content/csgo_addons// with scripts/, maps/, materials/, ...), a starter cs_script, Valve's point_script.d.ts + tsconfig.json, and a README with the Hammer setup steps. Fails if the addon already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
| name | Yes | Addon name: lowercase [a-z0-9_], e.g. 'jump_arena' | |
| with_script | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| game | Yes | |
| name | Yes | |
| root | Yes | Local content root of the addon |
| files | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds behavior beyond annotations by disclosing the failure condition ('Fails if the addon already exists') and the local workspace scope, though it does not detail permissions, idempotency beyond the failure case, or whether any existing files could be touched.
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 tightly structured into two sentences: the first front-loads the creation action and artifact list, and the second states the failure condition. There is no filler, and every clause contributes operationally useful 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?
The tool has an output schema, so return values do not need explaining. For a 3-parameter creation tool, the description covers the main outcome and failure mode well, but it leaves the with_script parameter's behavior ambiguous and does not explain how the game parameter affects the output beyond what the schema already states.
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 67%, so the schema already explains the game and name parameters. The description does not clarify the with_script boolean, and its statement that the tool creates 'a starter cs_script, Valve's point_script.d.ts + tsconfig.json' may imply these artifacts are always generated regardless of with_script, which could confuse an agent about the parameter's effect.
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 and resource: 'Create a new addon in the local workspace.' It goes further by enumerating the generated artifacts (scripts/, maps/, materials/, starter cs_script, point_script.d.ts, tsconfig.json, README), so an agent knows exactly what the tool produces and can distinguish it from related tools like write_addon_file or get_addon.
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 the tool by saying it creates a new addon and fails if the addon already exists. However, it does not explicitly name alternatives or state when not to use it (e.g., use write_addon_file to edit an existing addon). The usage context is present but not fully framed against sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsARead-onlyIdempotent
Full-text search across everything. Each hit's key feeds the detail tool for its kind:
convar/command→get_convar(name), entity→get_entity('side:classname'), schema_class/schema_enum→
get_schema_class('module:Name'), event→get_game_event, script→get_script_api, pulse→search_pulse,
example→get_example(key), doc→get_doc(key). With game set, general docs are included too.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Restrict to one game id | |
| kinds | No | Restrict result kinds: convar, command, entity, schema_class, schema_enum, event, script, pulse, example, doc | |
| limit | No | ||
| query | Yes | Free text or identifier, e.g. 'round time', 'OnTrigger' |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| limit | Yes | |
| total | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered and the description only needs to add context. It adds the cross-corpus reach and the `game`-includes-general-docs rule, but says nothing about ranking, ordering, or what happens when results exceed the limit cap of 50.
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?
Purpose is front-loaded in the first sentence with the routing table following, and there's no filler. The routing block is a dense run-on with inconsistent formatting (get_convar(name) vs get_entity('side:classname')), which slightly hurts scannability.
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 need no explanation, and the routing table tells the agent what to do with each hit. Still missing is search-behavior context an agent needs to call correctly at scale: ranking order, and the fact that limit caps at 50 with no described pagination.
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 75% and already documents `query`, `game` and `kinds`; the description's "With `game` set, general docs are included too" adds non-obvious semantics beyond the schema. `limit` remains undocumented in both places (default 15, hard max 50, no paging described), which is the only substantive 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?
"Full-text search across everything" names a specific verb and scope, and the kind→tool routing table immediately separates it from setup tools like list_convars, list_docs or search_pulse. An agent can tell exactly what this tool covers and where each result leads without opening another schema.
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 per-kind routing (convar→get_convar, pulse→search_pulse, doc→get_doc) effectively tells the agent which sibling to call for follow-up, and the `game` note explains a scoping behavior. It stops short of saying when to prefer this over sibling listers (e.g. list_docs vs a full-text search) or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pulseCRead-onlyIdempotent
Search Pulse (Valve's visual scripting) node bindings: entity inputs/outputs and functions.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| kind | No | ||
| limit | No | ||
| query | No | Substring of binding name, library or friendly name | |
| library | No | Exact library, e.g. CBaseEntity_API |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| limit | Yes | |
| total | Yes | |
| offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is fully covered. The description adds no behavioral context beyond that: nothing about pagination/limit behavior, result ordering, or how substring matching works across name/library.
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 with no filler. It is efficient, but that efficiency comes at the cost of any filtering or alternative guidance.
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?
With rich annotations and an output schema present, the description needn't explain returns or safety. But for a 5-parameter search tool with a limit ceiling of 200 and free-text query, the agent gets no picture of how to narrow results or what the searchable surface is.
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 60%, with game, query and library described but kind and limit only carrying enums/defaults. The description partly compensates by naming the input/output/function binding kinds (omitting 'class') and the entity I/O concept, but says nothing about query's substring semantics or library's exact-match filter.
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?
Specific verb+resource: 'Search Pulse node bindings', with the parenthetical defining Pulse as Valve's visual scripting so the agent knows the domain. The scope ('entity inputs/outputs and functions') separates it from sibling lookups like get_schema_class and find_entities_with_io, though it doesn't name any sibling explicitly.
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 statement of when to reach for this versus find_entities_with_io, get_schema_class, or search_docs, and no prerequisites beyond the required game param. The resource scope implies the context but the description never routes the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoARead-onlyIdempotent
This server's DB identity: db_path, data_dir, pid, started_at and version, plus status.
Compare it against the other server's `GET /api/health` before writing so two servers pointed
at different data dirs (a split store) are caught instead of silently diverging.| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| pid | Yes | |
| status | No | |
| db_path | Yes | |
| version | Yes | |
| data_dir | Yes | |
| public_url | No | Base URL of the web UI (S2DOCS_PUBLIC_URL, else LAN fallback) |
| started_at | Yes | |
| auth_required | No | True when S2DOCS_AUTH_TOKEN is set (mutating /api and /mcp need a token) |
| confirms_jsonl | No | Append-only confirm journal a waiting agent watches (data_dir/confirms.jsonl) |
| latest_confirm | No | Atomically-rewritten newest human confirm (data_dir/latest_confirm.json) |
| job_events_jsonl | No | Append-only job-event journal a waiting agent watches (data_dir/job_events.jsonl) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, idempotent, non-open-world operation. The description adds meaningful operational context about why checking server identity matters before writes, though it does not discuss auth, rate limits, or status interpretation.
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 tight sentences: first it states what identity fields are returned, then it explains the safe usage pattern. Nothing is wasted and the return-value context is front-loaded.
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 a simple zero-argument server identity query with an output schema available, so return values need not be exhaustively described. The annotations cover safety semantics, and the description adds the key pre-write split-store rationale, making it 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?
This tool takes zero input parameters, so the baseline for parameter semantics is 4. The schema is empty and the description appropriately does not invent input-parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as this server's DB identity and lists the concrete fields it reports. It is specific enough to distinguish this from broader host or build tools, though it does not explicitly name a sibling alternative.
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 gives a clear usage context: compare this server's identity against the other server's health endpoint before writing, to catch split-store divergence. The guidance is actionable but does not state when not to use the tool or name a specific MCP sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_projectA
Start a persistent orchestration project and get the first ready step(s). Progress is stored on the server, so any later session can continue with next_step(project_id).
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
| goal | Yes | What to build, in the user's words | |
| addon | No | Addon name (default: derived from goal) | |
| steps | No | Steps for workflow='custom' | |
| title | No | ||
| inputs | No | Workflow inputs (see list_workflows) | |
| workflow | Yes | Workflow id from list_workflows, or 'custom' |
Output Schema
| Name | Required | Description |
|---|---|---|
| game | Yes | |
| goal | Yes | |
| addon | No | |
| title | Yes | |
| status | Yes | |
| guidance | Yes | |
| progress | Yes | |
| next_steps | No | |
| project_id | Yes | |
| blocked_steps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds useful context that state is persisted server-side and survives sessions, but it omits traits like whether repeated calls create duplicate projects or what side effects occur on the server.
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 tight sentences; the core action is front-loaded and the follow-up session guidance follows immediately. 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?
An output schema exists so return values need no explanation, and the persistence model plus continuation path are stated. Only minor gaps remain around idempotency and side effects of project creation.
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 86%, so parameters like workflow, goal, addon, steps and inputs are largely documented already. The description adds only an indirect hint (project_id exists as an output consumed by next_step) and says nothing extra about workflow/steps semantics.
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 ('Start a persistent orchestration project') plus what it returns ('the first ready step(s)'). It also names the continuation sibling next_step(project_id), so an agent can separate this from list_projects/get_project/next_step without opening any schema.
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?
Implies the when: begin a new orchestration project and hand back the first actionable step; and it explicitly routes continuation to next_step(project_id). No explicit exclusions (e.g., when to resume vs. start fresh, or how this differs from list_projects) are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_clearBIdempotent
Dismiss a session (iso_test off): state=idle, releasing a still-held host lease.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| lock | No | The host lock this run holds (owner test:<id>), when it is still its own |
| name | Yes | |
| note | No | |
| step | No | |
| state | Yes | |
| host_id | No | |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| elapsed_sec | No | Seconds since started_at (frozen at finished_at once terminal) |
| finished_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly=false, idempotent=true, destructive=false), and the description adds real context beyond them: the session transitions to state=idle and a held host lease is released, with 'still-held' signaling the release is conditional. It does not say what happens if no lease is held or whether the run record survives.
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 with the effect (idle, lease release) stated up front and the CLI equivalent in parentheses. No filler; slightly telegraphic syntax ('state=idle, releasing...') but nothing wasted.
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 and annotations cover the safety profile, so the description needn't explain returns. However, for a required run_id with zero schema coverage, the definition leaves a genuine gap about what that identifier refers to and what failure modes exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter run_id has 0% schema description coverage, so the description must carry its meaning. The description only refers obliquely to 'a session' and never mentions run_id, its format, or whether it identifies the session being dismissed — leaving the one required input essentially undocumented.
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 object ('Dismiss a session') plus the resulting state and the lease release, and names the underlying command (`iso_test off`). It is clear what the tool does, but it never distinguishes itself from sibling lifecycle tools like test_finish or release_host, which an agent must choose between.
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?
Usage is only implied: 'Dismiss a session' suggests end-of-test cleanup, and 'releasing a still-held host lease' hints at when it is applicable (a lease still held). There is no explicit when-to-use versus test_finish/release_host, and no stated exclusions or preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_finishAIdempotent
Finish a running session pass/fail (the HUD's iso_test pass|fail): releases the host lease and
records a console-transcript evidence row on the linked project when there is one.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | What happened / the failure | |
| result | Yes | ||
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| lock | No | The host lock this run holds (owner test:<id>), when it is still its own |
| name | Yes | |
| note | No | |
| step | No | |
| state | Yes | |
| host_id | No | |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| elapsed_sec | No | Seconds since started_at (frozen at finished_at once terminal) |
| finished_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent, non-destructive; the description goes beyond them by disclosing the real side effects — releasing the host lease and writing an evidence row on the linked project, with the qualifier "when there is one." It stops short of saying what happens to the lease on a failed call or error 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?
One sentence, front-loaded with the verb and outcome, with the side effects in a trailing clause. No filler; the only slight cost is the unexpanded HUD shorthand, which assumes familiarity.
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?
With annotations covering safety and an output schema covering return values, the description's main remaining burden is side effects and scope, which it largely fulfills (lease release, evidence row, project linkage). The gap is the undocumented `run_id` parameter and no note about idempotency semantics beyond the annotation.
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 only 33% — only `note` is documented. The description's "pass/fail" hints at the `result` enum but adds nothing about `run_id` (scope/format) or the consequence of each result value, so it does not compensate 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?
States a specific verb (finish a running session) plus outcome (pass/fail) and the concrete side effects (host lease release, evidence row). Clear and distinguishable from test_start/test_step/test_status, though it never names sibling test_clear or job_finish, which could plausibly be confused with it.
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?
"Finish a running session" implies it follows test_start, and the HUD equivalence gives context, but there is no explicit statement of when to use this versus test_clear or job_finish, nor any precondition (must the session be running?). Usage is implied rather than specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_startA
Start a server-side test session (state=running). Claims the host lease when a host is given.
Mirror the state onto the in-game TEST STATUS HUD yourself via iso_test start over netcon.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Label shown on the HUD strip, e.g. 'iso_test' | |
| host_id | No | Host to claim for the session (optional) | |
| project_id | No | Project this session belongs to (optional) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| lock | No | The host lock this run holds (owner test:<id>), when it is still its own |
| name | Yes | |
| note | No | |
| step | No | |
| state | Yes | |
| host_id | No | |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| elapsed_sec | No | Seconds since started_at (frozen at finished_at once terminal) |
| finished_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-idempotent, non-destructive mutation, and the description adds two non-obvious behaviors: that passing a host claims a host lease, and that the agent must itself mirror state onto the in-game TEST STATUS HUD via `iso_test start` over netcon. The external follow-up action is the kind of context annotations cannot convey. What is missing is behavior when a session is already running, given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the purpose front-loaded and no filler. The third sentence is the most valuable and could have been placed more prominently, and the inconsistent indentation slightly hurts scanning, but there is no wasted text.
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 and annotations cover the safety profile, so the description only needs to carry session lifecycle and host-lease semantics — which it does, including the out-of-band HUD mirroring requirement. The remaining gap is concurrency/duplicate-start behavior for a tool flagged as non-idempotent.
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 100%, so the baseline is 3, but the description earns a bump by explaining the consequence of host_id (a lease is claimed) rather than just restating 'Host to claim for the session'. The netcon/HUD sentence also clarifies the practical role of the name label.
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 ('Start a server-side test session') plus the resulting state ('state=running'), which separates it from test_finish/test_step/test_status implicitly. It never names a sibling explicitly, so differentiation is inferable 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?
Usage is implied — you start a session, and the conditional 'Claims the host lease when a host is given' hints at when to pass host_id. There is no explicit statement of when to call this versus test_finish, test_step, or list_test_runs, and no prerequisite/exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_statusARead-onlyIdempotent
One test run's record, or the current active run when no id is given.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | No | Run id; omit for the current (most recent active) run |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| lock | No | The host lock this run holds (owner test:<id>), when it is still its own |
| name | Yes | |
| note | No | |
| step | No | |
| state | Yes | |
| host_id | No | |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| elapsed_sec | No | Seconds since started_at (frozen at finished_at once terminal) |
| finished_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety and mutability are covered. The description adds the current-active-run fallback, but does not state behavior when no active run exists or when an unknown id is supplied.
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 well-formed sentence with no wasted words, front-loading the two cases an agent needs to distinguish.
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?
With an output schema present and annotations covering the read-only safety profile, the description is nearly complete for a one-optional-parameter lookup tool. Its only notable omission is behavior when there is no active run or the id is invalid.
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 100% and the run_id schema description already says omission returns the current most recent active run. The description restates that behavior but adds no syntax or edge-case meaning 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 identifies the resource as a single test run record and explicitly distinguishes the no-id case as the current active run. It is clear enough to tell apart from list_test_runs, though it phrases the operation as a returned object rather than naming a retrieval 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?
It gives a usage rule for the optional run_id: omit it to get the most recent active run. However, it does not state when to prefer this over siblings such as list_test_runs or test_start, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_stepAIdempotent
Set the running session's current step (the HUD strip's iso_test step). Running runs only.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Current step label, e.g. 'wall-occlusion probe' | |
| run_id | Yes | Run id from test_start, e.g. 't-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| lock | No | The host lock this run holds (owner test:<id>), when it is still its own |
| name | Yes | |
| note | No | |
| step | No | |
| state | Yes | |
| host_id | No | |
| web_url | No | Absolute URL of this run's page in the web UI (Activity page) |
| created_at | Yes | |
| project_id | No | |
| started_at | No | |
| updated_at | Yes | |
| elapsed_sec | No | Seconds since started_at (frozen at finished_at once terminal) |
| finished_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a non-destructive, idempotent mutation. The description adds meaningful behavioral context beyond them: it affects the HUD strip label and is constrained to running runs. It omits error behavior outside a running session, but the state constraint is the key operational 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?
Two short sentences with zero filler; the core purpose and the running-run constraint are both front-loaded. Every clause carries 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?
With an output schema, full parameter coverage, and annotations covering the mutation profile, the description supplies the remaining operational context: what is being set and the running-run restriction. The only minor gap is not stating what happens if invoked outside a running session.
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 100%, with both parameters documented and examples given in the schema itself. The description adds no additional parameter semantics, so the baseline of 3 is appropriate.
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: 'Set the running session's current step', with a concrete internal reference ('HUD strip's `iso_test step`'). The scope qualifier 'Running runs only' disambiguates it from start/finish/clear siblings, though it does not explicitly contrast with update_step/next_step.
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?
'Running runs only' implies the tool is only callable after test_start and during an active run, which is useful context. However, no alternatives or explicit when-not conditions are named, so the agent must infer the prerequisite and the boundary against test_finish/test_clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_stepA
Record progress on a step and get the next brief. Marking 'done' runs the step's gate (e.g. all addon scripts must type-check); if it fails you get the problems back — fix them and retry.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | What was done / why skipped or blocked | |
| status | Yes | ||
| step_id | Yes | ||
| artifacts | No | File paths, URLs, key findings | |
| project_id | Yes | Project id from start_project, e.g. 'p-1a2b3c4d' |
Output Schema
| Name | Required | Description |
|---|---|---|
| game | Yes | |
| goal | Yes | |
| addon | No | |
| title | Yes | |
| status | Yes | |
| guidance | Yes | |
| progress | Yes | |
| next_steps | No | |
| project_id | Yes | |
| blocked_steps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state this is a non-read-only, non-destructive mutation, so the bar is lower. The description meaningfully adds that 'done' triggers validation gates and returns problems on failure, which is important behavioral context not captured by annotations.
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 tight sentences, front-loaded with the action and followed by the critical gate/retry behavior. There is no wasted text.
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 explanation is unnecessary. The description covers the main workflow and failure loop well, though it could be slightly more complete about non-'done' status 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?
Schema description coverage is 60%, with notes, artifacts, and project_id documented in the schema. The description adds semantics for the 'done' status specifically, but does not explain step_id or the meaning/effects of in_progress, skipped, blocked, and pending.
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 names a specific verb and resource: recording progress on a step and getting the next brief. It clearly distinguishes the tool from a pure read by explaining that marking 'done' triggers the step gate, though it does not explicitly name the sibling next_step as an alternative.
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 gives clear guidance for the 'done' path: the gate runs, failures return problems, and the agent should fix and retry. However, it does not explain when to use update_step versus next_step or how the other statuses should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_cfgARead-onlyIdempotent
Check every command in a .cfg against the indexed convars/commands: unknown names (with suggestions), out-of-range values, cheat/devonly flags, and client-vs-server context.
| Name | Required | Description | Default |
|---|---|---|---|
| game | Yes | Game id: one of cs2, deadlock | |
| text | Yes | Contents of a .cfg file | |
| context | No | Where the cfg runs (affects warnings) | server |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| errors | Yes | |
| commands | Yes | |
| warnings | Yes | |
| diagnostics | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, closed-world operation, so the safety profile is covered. The description adds real value by disclosing the specific categories of problems surfaced (unknown names with suggestions, out-of-range values, cheat/devonly flags, context mismatches), which tells an agent what to expect back beyond the hints.
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 dense sentence that front-loads the action and resource, then enumerates the checks in a compact parenthetical list. Every clause carries useful information and nothing is padded.
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?
With an output schema present, return values need not be described, and the required parameters plus context default are covered by the schema. The description supplies enough on validation dimensions for correct invocation, though it could say what the agent should do with the findings (e.g., fix and revalidate) before deploying.
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 100%, so game, text, and context are already fully documented, including the context enum and its default. The description's mention of 'client-vs-server context' loosely reinforces what the context parameter governs, but adds no format or syntax guidance for text or game beyond the schema. Baseline 3 applies.
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 (check) and resource (every command in a .cfg) and enumerates exactly what is validated: unknown names with suggestions, out-of-range values, cheat/devonly flags, and client-vs-server context. This clearly separates it from the similarly named sibling validate_cs_script, which targets scripts rather than .cfg contents.
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 scope 'every command in a .cfg' makes the intended use case clear (validating a config file's contents), and 'client-vs-server context' hints that the outcome depends on where the cfg runs. It stops short of naming any alternative or stating exclusions, such as when to prefer get_convar or list_convars for a single lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_cs_scriptARead-onlyIdempotent
Type-check a cs_script with the TypeScript compiler against this build's Valve point_script.d.ts.
Errors with category unknown_api mean the method/property does not exist — fix before shipping.
needs_type_narrowing gives the subclass to cast to. ALWAYS run this before handing a script to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | JavaScript source to check | |
| game | No | Game id: one of cs2, deadlock | cs2 |
| path | No | Path of the .js file inside the addon | |
| addon | No | Or: addon whose file to check |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when there are no errors (warnings/info allowed) |
| errors | Yes | |
| checker | Yes | |
| warnings | Yes | |
| diagnostics | Yes | |
| instance_methods_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, so the description uses its space well by explaining diagnostic semantics: what `unknown_api` and `needs_type_narrowing` mean and what to do about each. It does not describe the overall result shape or whether all errors are returned at once, leaving a gap, but the added error-category context is genuinely beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the error-code gloss, then the workflow mandate. No filler and nothing repeated from annotations.
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?
With an output schema present, the description needn't explain return values, and it covers action, error interpretation, and workflow timing. The main omission is guidance on the code-vs-path/addon input modes, which an agent must still infer.
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 100%, so the individual parameters are documented by the schema. However, the schema shows two competing input modes (`code` vs `path`/`addon`) with no mutual-exclusivity rule, and the description says nothing to disambiguate them or to explain the `game` default; baseline 3.
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 precise verb and resource: type-check a cs_script with the TypeScript compiler against this build's point_script.d.ts. That is specific enough to separate it from validate_cfg and from read-only lookups like get_script_api or list_script_types.
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?
"ALWAYS run this before handing a script to the user" gives an explicit trigger condition in the authoring workflow, which is the key usage decision. It stops short of naming alternatives or when-not-to-use cases, so it is clear context without full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_addon_fileA
Write a text source file (.js, .cfg, .vmat, .vdata, panorama .xml/.css, ...) into an addon. Binary/compiled assets are produced by Valve's tools, not written here. Use overwrite=true to replace.
| Name | Required | Description | Default |
|---|---|---|---|
| game | No | Game id: one of cs2, deadlock | cs2 |
| name | Yes | Addon name: lowercase [a-z0-9_], e.g. 'jump_arena' | |
| path | Yes | Path inside the addon, e.g. 'scripts/jump_arena.js' | |
| content | Yes | ||
| overwrite | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| size | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description adds value by explaining the scope boundary against Valve's tooling and disclosing that replacement is opt-in via overwrite — consistent with destructiveHint=false. It does not cover error behavior when a file exists and overwrite is false, or whether parent directories are created, which would round this to a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the verb-and-resource statement, then the scope exclusion, then the overwrite directive. 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?
An output schema exists, so return values need not be explained, and annotations cover safety. The write semantics, supported file types, and overwrite behavior are all present; only directory auto-creation and the failure mode for an existing file without overwrite are unstated.
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 60%; game, name, and path are documented in the schema, while content and overwrite are not. The description explains overwrite's semantics (must be explicitly set to replace an existing file), which is genuinely additive, but adds nothing for content or for how path interacts with the allowed file types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('write'), a specific resource ('text source file'), enumerates the concrete file types it handles (.js, .cfg, .vmat, panorama .xml/.css), and explicitly states what it does not handle (binary/compiled assets). This lets an agent separate it from read_addon_file and scaffold_addon without reading the schema.
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 only explicit conditional is 'Use overwrite=true to replace', which governs a parameter rather than tool selection. It never says when to choose this over read_addon_file or scaffold_addon, so the agent must infer usage from the file-type list.
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.
73 tool updates
v0.1.0- First observed
add_evidence - First observed
build_cancel - First observed
build_list - First observed
build_log - First observed
build_model - First observed
build_start - First observed
build_status - First observed
build_wait - First observed
claim_host - First observed
deploy_list - First observed
deploy_push - First observed
deploy_verify - First observed
diff_builds - First observed
find_entities_with_io - First observed
get_addon - First observed
get_convar - First observed
get_doc - First observed
get_entity - First observed
get_example - First observed
get_game_event - First observed
get_host - First observed
get_project - First observed
get_prompt_text - First observed
get_schema_class - First observed
get_script_api - First observed
heartbeat_host - First observed
job_assign - First observed
job_attach - First observed
job_cancel - First observed
job_enqueue - First observed
job_event - First observed
job_finish - First observed
job_get - First observed
job_link - First observed
job_list - First observed
job_next - First observed
job_request_screenshot - First observed
job_restatus - First observed
job_screenshots - First observed
job_start - First observed
job_verdict - First observed
list_addons - First observed
list_convars - First observed
list_docs - First observed
list_evidence - First observed
list_examples - First observed
list_game_events - First observed
list_games - First observed
list_hosts - First observed
list_projects - First observed
list_schema_classes - First observed
list_script_types - First observed
list_test_runs - First observed
list_workflows - First observed
next_step - First observed
probe_host - First observed
read_addon_file - First observed
register_host - First observed
release_host - First observed
scaffold_addon - First observed
search_docs - First observed
search_pulse - First observed
server_info - First observed
start_project - First observed
test_clear - First observed
test_finish - First observed
test_start - First observed
test_status - First observed
test_step - First observed
update_step - First observed
validate_cfg - First observed
validate_cs_script - First observed
write_addon_file
TDQS
Scored across 73 tools
Most tools target distinct resources and actions, and the long descriptions clarify boundaries between docs, builds, jobs, hosts, tests, and projects. However, with 73 tools there is meaningful cross-domain overlap and potential confusion among job/test/project/evidence lifecycle tools and among related build/deploy/test list/status/finish operations.
All names use snake_case, which helps readability, and many tools are grouped by domain prefixes such as job_, build_, deploy_, and test_. But the convention mixes noun_verb domain-prefixed names (job_list, build_start) with generic verb_noun names (list_projects, get_host), so it is readable but not fully consistent.
The server exposes 73 tools, which is far beyond a well-scoped set for a single MCP server. Even though the surface spans several subdomains, the count is extreme and creates a heavy selection and maintenance burden.
The surface is broad and covers most major workflows: documentation lookup, schema/entity/script queries, addon creation and editing, build/deploy/test lifecycle, host management, jobs, evidence, and projects. Minor gaps remain, such as addon/file deletion or project cleanup operations, but core workflows are well covered.
Maintenance
Related MCP Connectors
Versioned documentation registry and semantic search for AI tools and coding assistants.
Serves your design system and coding standards to coding agents, so they stop guessing.
Gemmein docs, API reference, error explainers and a live integration check for coding agents.
Provide your AI coding tools with token-efficient access to up-to-date technical documentation for…
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables AI clients to create, inspect, edit, and deploy Counter-Strike 2 maps and addons by working with Hammer map files, addon source files, Valve's resource compiler, and Workshop Tools locally.1-
- AlicenseAqualityAmaintenanceEnables coding agents to develop Open77 server resources with the full Lua API, permissions, events, game data, guides, and schemas pinned to a specific server build, plus validation and live server tools.2715 npm1MIT
- AlicenseAqualityAmaintenanceProvides AI assistants offline access to Counter-Strike 2 Workshop Tools documentation, enabling full-text search and page retrieval through MCP.3MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to discover and invoke tools for saving and retrieving code snippets, generating style guides and wiki documentation, and orchestrating multi-agent documentation workflows with semantic search.-