vmware-vdi
Manage VMware Horizon VDI (desktop pools, RDS farms, published apps, sessions, machines, entitlements, images, events) via MCP tools or CLI, with read-only monitoring, gated/audited write operations that preview blast radius, and task tracking.
Monitoring & health:
health_summary,pool_utilization,session_stats,event_list— one-glance VDI health, per-pool capacity, session concurrency, audit events.Sessions:
session_list,session_getto inspect sessions;session_logoff,session_disconnect,session_send_messagefor ops (all writes gated by confirm unless informational).Machines:
machine_list,machine_get;machine_reset,machine_maintenance,machine_remove(instant-clone removal deletes backing VM).Pools & farms:
pool_list,pool_get,farm_list,app_pool_list;pool_set_enabledto enable/disable;pool_push_imageto push golden images to instant-clone pools (recreates desktops, highest blast radius).Entitlements:
entitlement_list,entitlement_add,entitlement_remove;ad_user_searchto resolve SIDs.Tasks:
task_status,task_cancelfor image push/provisioning tasks.Safety: write tools return blast radius before confirm; unknown occupancy or unreadable state refuses confirmation; all writes are audit-logged to
~/.vmware/audit.db.CLI:
init,doctor,healthand direct command workflows for help-desk and scripting.
Manages VMware Horizon VDI environments, including desktop pools, RDS farms, published apps, user sessions, desktop machines, entitlements, instant-clone images, and Horizon events/health/statistics through the Horizon Connection Server REST API.
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., "@vmware-vdiShow me all active sessions in the Finance pool"
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.
VMware VDI (Horizon)
AI-powered intelligent operations for VMware / Omnissa Horizon VDI — manage desktop pools, RDS farms, published apps, user sessions, desktop machines, entitlements, instant-clone images, and Horizon events/health/statistics through the Horizon 8 Connection Server REST API. Ships as both an MCP server (for AI agents) and a CLI (for help-desk and scripting). Part of the VMware skill family.
Disclaimer: Community-maintained open-source project, not affiliated with, endorsed by, or sponsored by VMware, Inc., Broadcom Inc., or Omnissa, LLC. "VMware", "Horizon", and "Omnissa" are trademarks of their respective owners. Source is publicly auditable under the MIT license.
Status: v1.0.0 (beta). REST endpoints are verified against the official Horizon Server API; GET-response field projections are defensive and pending validation against a live Connection Server (a field-name mismatch yields empty results, not a crash — see the beta note).
Why vmware-vdi
Every other VMware family skill stops at the vСenter VM. A Horizon desktop pool sits on those VMs —
so vmware-aiops can reset the backing VM, but it cannot see a user session, log a user off, disable a
pool, or push a golden image. vmware-vdi fills exactly that day-2 VDI gap — "who is stuck on a broken
desktop", "log this user off so their profile unlocks", "why is this pool not provisioning", "push the
patched image to Finance tonight" — with the family's governed-ops harness: every write is audited,
previews its blast radius, and is authorized by the Horizon account's own RBAC role.
Related MCP server: vSphere MCP Server
Capabilities — 27 MCP tools (16 read / 11 write)
Category | Tools |
Monitoring | health summary · session list/get · machine list/get · event list |
Statistics | session concurrency stats · per-pool utilization |
Management | pool list/get · farm list · app-pool list · entitlement list · image list · AD search · pool enable/disable · entitlement add/remove |
Ops actions | session logoff / disconnect / message · machine reset / maintenance / remove |
Tasks | task status · image push · task cancel |
Reads are strictly non-destructive. Writes preview their blast radius, double-confirm at the CLI, and
are audit-logged to ~/.vmware/audit.db. pool_push_image recreates every desktop in a pool — the
highest single-call blast radius in the family — and its preview states affected-desktop and
in-session counts before any confirm, together with occupancy: determined when those counts
can be believed, unknown when sessions exist that cannot be attributed to any pool or farm. An
unknown occupancy refuses the confirm rather than reporting an unverified zero; overriding it
needs --acknowledge-unknown-occupancy and is recorded in the audit row. A machine that names no
desktop pool also makes the desktop count a lower bound ("at least N"); that refuses the confirm
with no override.
On MCP, every gated write takes confirm (default false). A call without it returns blast_radius —
the object's identity, counts, identifiers up to 20, blockers and unmeasured — and changes nothing;
the acting response carries the same dict. An agent should show it to the user and pass confirm=true
only after they agree. When something the blast radius depends on could not be read — a machine's
state, a session's user, a task's type or state, a pool's enabled flag, a pool's current entitlements —
confirm=true is refused with a message naming what to check.
Quick start
uv tool install vmware-vdi
vmware-vdi init # friendly wizard: connect to a Connection Server + discover your pools
vmware-vdi doctor # verify config / credentials / connectivity
vmware-vdi health # one-glance VDI healthvmware-vdi init prompts for the Connection Server host, admin username, AD domain, and password; writes
~/.vmware-vdi/config.yaml + a 0600 .env (password obfuscated); tests the login; and on success
discovers your pools, machines, and sessions with the next commands to try.
Example workflows
Help-desk — a user's desktop is stuck
vmware-vdi session list --user alice
vmware-vdi machine list --state AGENT_UNREACHABLE
vmware-vdi session logoff --user alice --dry-run # preview which sessions
vmware-vdi session logoff --user alice # double-confirm, then logs off + auditsPatch night — push a new golden image
vmware-vdi image list
vmware-vdi pool push-image --id pool-fin --dry-run # BLAST RADIUS: N desktops, M logged-in users
vmware-vdi pool push-image --id pool-fin # double-confirm; returns a task
vmware-vdi task status --pool pool-fin # track progressMCP server
{
"mcpServers": {
"vmware-vdi": {
"command": "vmware-vdi",
"args": ["mcp"],
"env": { "VMWARE_VDI_CONFIG": "~/.vmware-vdi/config.yaml" }
}
}
}Using the installed vmware-vdi mcp console script (not uvx) avoids a PyPI re-resolve on every launch —
important behind enterprise TLS proxies.
Supported versions
VMware Horizon 8.x (primary) — Connection Server REST API
/rest/v1.Latest Omnissa Horizon (2406 / 2412+) — same
/rest/v1lineage.
Security
Authorization = Horizon RBAC. The skill does not gate read vs write; point a target at a read-only Horizon admin role and every write is refused at the Connection Server, un-bypassably.
Credentials live only in
~/.vmware-vdi/.env(0600, obfuscatedb64:at rest); config files hold host/username/domain only. InjectVMWARE_VDI_<TARGET>_PASSWORDfrom a secret manager for real secrecy.TLS verification on by default. All Connection-Server text is
sanitize()d against prompt injection.No outbound calls except to the configured Connection Server — no webhooks, no telemetry.
See SECURITY.md and skills/vmware-vdi/references/setup-guide.md.
Beta note
REST endpoints are verified against the official Horizon Server API operation index. GET-response
field names (and a few write bodies) are defensive (.get() with fallbacks) and pending validation
against a live Connection Server. On a field-name mismatch a list reads empty rather than crashing.
First real-Horizon use should run vmware-vdi init and confirm the session/machine/pool projections;
please file an issue with raw *_get output if a projection
looks empty. Quality: 32 regression tests, ruff clean, bandit 0, tool endpoints pinned to a verified spec.
Companion skills
Part of the VMware skill family — install the modules you need:
vmware-aiops — the vCenter VMs backing the desktops (power, snapshot, clone, migrate)
vmware-monitor — read-only vSphere monitoring
vmware-nsx-security — desktop network microsegmentation
vmware-aria · vmware-nsx · vmware-storage · vmware-vks · vmware-avi · vmware-harden
License
MIT — see LICENSE.
Available Tools
27 toolsad_user_searchARead-onlyIdempotent
[READ] Resolve AD users/groups by name to their SIDs — needed to entitle a pool (entitlement_add).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name substring to search for. | |
| limit | No | Max principals to return (default 25). | |
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral context by specifying the output concept (SIDs) and the integration purpose. It does not contradict annotations and adds value beyond them.
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 no filler. The READ tag and core purpose are front-loaded, and the downstream consumer (entitlement_add) is named efficiently without 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?
For a simple read-only search tool, the description plus annotations and full schema coverage are nearly complete. The description states the output goal (SIDs) even though no output schema exists. It could specify response shape or pagination behavior, but the current definition is adequate for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (name, limit, target) are already documented. The description adds no extra parameter-level detail beyond the schema. Baseline 3 is appropriate because 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 states a specific verb ('Resolve'), a specific resource ('AD users/groups'), and a concrete outcome ('to their SIDs'). It also distinguishes itself from the sibling tools by tying its purpose to entitlement_add, so an agent can tell what this tool does at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear contextual usage by explicitly saying this is needed to entitle a pool via entitlement_add. It does not list exclusions or alternatives, but there is no close sibling search tool to differentiate from, so the downstream pointer is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_pool_listARead-onlyIdempotent
[READ] List published application pools: id, name, farm, enabled, executable path. Paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 50). | |
| offset | No | Page offset. | |
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already signal read-only and non-destructive behavior, so the burden is lower. The description adds a [READ] tag, explicitly states that the result is paginated, and lists the returned fields, providing useful behavior beyond the annotations without contradicting them.
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 single sentence is front-loaded with the READ tag and has zero fluff. It packs the action, resource, fields, and pagination into a compact, unmistakable frame, and every word 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 simple list tool with no output schema, the description covers the output fields, pagination, and read-only nature. The target parameter is left to the schema, which already defines it, so there is no substantive gap. It stops short of a 5 only because it does not mention the relation to separately paginated siblings or any optional filtering behavior, though these are not necessarily expected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all three params, so the baseline is 3. The description's mention of pagination selectively addresses limit/offset but adds nothing about the target parameter. No additional meaning is given that isn't already available in the schema, so a 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 states a clear verb ("List") and resource ("published application pools") and enumerates the fields returned (id, name, farm, enabled, executable path). It is clear and concise, but it does not explicitly differentiate itself from the sibling pool_list, so it leaves a slight ambiguity for an agent deciding which list tool to use.
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 communicates what the tool does but not when to use it relative to alternatives. There is no mention of when to prefer this over pool_list, pool_get, or other sibling tools, and no mention of conditions like 'use this to list all published app pools' or exclusions. The purpose implies a use case, but the boundary is left to the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entitlement_addAIdempotent
[WRITE] Grant desktop-pool access to AD user/group SID(s).
Get SIDs from ad_user_search. A bare call returns blast_radius (pool identity, which principals are already entitled and which are new) and grants nothing; confirm=True grants. Refused when the pool's current entitlements cannot be read. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True grants. | |
| pool_id | Yes | The desktop-pool id (from pool_list). | |
| ad_user_or_group_ids | Yes | AD SIDs to entitle (from ad_user_search). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses behavior beyond annotations: a bare call returns blast_radius and grants nothing, confirm=True grants, the tool refuses when entitlements cannot be read, and it is audited. It also includes an important safety directive: do not set confirm=True on your own because the user has not yet seen the blast radius. No contradiction with the annotations is present.
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: the purpose appears in the first sentence, followed by essential workflow and safety guidance. Every sentence earns its place, including the final 'Audited.' There is no repetition of schema details or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the return behavior of a bare call (blast_radius with pool identity, existing vs new principals) and the effect of confirm=True. It covers the key prerequisites, the refusal edge case, and the required user interaction step. This is sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all parameters at 100%, and the description adds meaningful context: ad_user_or_group_ids are SIDs from ad_user_search, pool_id comes from pool_list, and confirm=False/default returns blast_radius while confirm=True grants. The blast_radius explanation ('which principals are already entitled and which are new') adds value beyond the 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 opens with a clear verb and resource: 'Grant desktop-pool access to AD user/group SID(s).' It also clarifies the write nature with '[WRITE]' and names the exact entity being modified, distinguishing it naturally from entitlement_remove. The scope is specific enough that an agent can understand what this tool does without inspecting 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 description gives strong usage workflow: get SIDs from ad_user_search, call without confirm to see blast_radius, show it to the user, wait for their decision, and do not auto-confirm. It also states a refusal condition. It stops short of explicitly naming alternatives such as entitlement_remove, but the 'Grant' phrasing and sibling list make the use case clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entitlement_listARead-onlyIdempotent
[READ] List the AD users/groups entitled to a desktop pool (who can access it). Paginated.
A wrong pool id returns a teaching 404. Use pool_list for pool ids.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 50). | |
| offset | No | Page offset. | |
| target | No | Horizon target from config.yaml; omit to use the default. | |
| pool_id | Yes | The desktop-pool id (from pool_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds useful behavioral details beyond those annotations: pagination and the teaching 404 on a wrong pool id, which helps the agent handle failures gracefully. No contradiction exists.
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 carry all essential information: purpose, pagination, error behavior, and id-sourcing guidance. The most important scoping information is front-loaded, and no filler or repetition is present.
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 paginated list tool with robust annotations and fully documented parameters, the description is complete. It covers what the tool returns (entitled AD users/groups), how pagination works, the failure mode on invalid ids, and where to get valid ids. No additional context is needed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters, including the default limit/offset and the target field. The description adds only minor value by connecting pool_id to pool_list, but this is already echoed in the schema; thus 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?
The description states a specific verb ('List'), a concrete resource ('AD users/groups entitled to a desktop pool'), and an accessibility gloss ('who can access it'). The term 'List' plus the entitlement_set naming distinguishes it from sibling tools like entitlement_add and entitlement_remove, and the reference to pool_list differentiates it from that 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?
The description gives clear context: it is paginated and requires a pool id, and it explicitly routes users to pool_list for obtaining valid ids. It does not explicitly state when not to use the tool or name alternatives for modifying entitlements, but the context is strong enough for an agent to use it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entitlement_removeADestructiveIdempotent
[WRITE] Revoke desktop-pool access from AD user/group SID(s).
Get SIDs from entitlement_list. A bare call returns blast_radius (pool identity, which principals lose access and which were not entitled) and revokes nothing; confirm=True revokes. Refused when the pool's current entitlements cannot be read. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True revokes. | |
| pool_id | Yes | The desktop-pool id (from pool_list). | |
| ad_user_or_group_ids | Yes | AD SIDs to remove (from entitlement_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint, readOnlyHint:false), the description discloses the critical two-phase behavior, the no-op bare call, the refusal condition when entitlements cannot be read, and that calls are audited. This gives an agent the safety context it needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured: it leads with the core action, then the two-phase workflow, refusal condition, and safety instruction. Every sentence contributes necessary information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, two-phase tool with no output schema, the description is complete: it explains the blast_radius return, how to confirm, when it refuses, what inputs to use, and the required user-decision loop. Nothing necessary for correct and safe invocation 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 already 100%, and the description adds important semantics: ad_user_or_group_ids must come from entitlement_list, pool_id from pool_list, and confirm's default false versus true behavior is explicitly tied to blast_radius and revocation. The description adds meaning beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Revoke desktop-pool access from AD user/group SID(s).' The two-phase behavior (bare call returns blast radius, confirm=True revokes) further clarifies exactly what the tool accomplishes, and the instruction to get SIDs from entitlement_list distinguishes it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for safe use: show blast_radius to the user and wait for their decision, and never set confirm=True unilaterally. It also names the source tool for SIDs (entitlement_list), though it does not explicitly discuss alternatives such as entitlement_add for granting access.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
event_listARead-onlyIdempotent
[READ] List Horizon audit events (newest first), optionally filtered by severity. Paginated.
Each item: time, severity, type, module, user, machine, message. Use for "what went wrong recently".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 50). | |
| offset | No | Page offset. | |
| target | No | Horizon target from config.yaml; omit to use the default. | |
| severity | No | Filter by severity (e.g. ERROR, WARNING, AUDIT_FAIL). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description adds behavioral context: 'newest first', 'paginated', and the fields each item contains (time, severity, type, module, user, machine, message). This goes beyond annotations without contradicting them.
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. The purpose and scope are front-loaded, and the item-field list is a useful detail packed efficiently. No filler or repetition; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, paginated list tool with fully documented parameters and no output schema, the description covers everything an agent needs: what it returns (item fields), ordering, filtering, and a use case. It is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (limit, offset, target, severity) are already documented with types and defaults. The description only adds the notion of optional severity filtering, which is also in the schema. It provides no extra semantics beyond what the schema conveys, 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 and resource ('List Horizon audit events') with clear scope (newest first, optional severity filter). The READ prefix reinforces read-only intent, and the use case ('what went wrong recently') makes it distinguishable from sibling tools like session_list or health_summary.
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 a clear use case: 'Use for "what went wrong recently"'. It does not explicitly name alternatives or exclusions, but the audit-event focus implicitly separates it from other list tools. The guidance is adequate for an agent to know when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
farm_listARead-onlyIdempotent
[READ] List Horizon RDS farms: id, name, type, enabled, RDS server count. Paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 50). | |
| offset | No | Page offset. | |
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is lower. The description adds useful context beyond those annotations by explicitly marking the operation as '[READ]' and revealing that results are paginated.
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 communicates the operation kind, resource, returned fields, and pagination behavior with zero filler. Every element 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 simple paginated list operation, the description names the resource, the returned fields, and the pagination behavior. Parameters are fully covered by the schema, and annotations cover the safety profile. No output schema exists, but the stated field list is enough for the agent to interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters limit, offset, and target are already fully documented in the schema. The description adds only a general 'Paginated' signal and does not need to repeat parameter details; 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?
The description uses a specific verb and resource: 'List Horizon RDS farms' with exact returned fields (id, name, type, enabled, RDS server count). This clearly scopes the operation and distinguishes it from sibling list tools like image_list, pool_list, and machine_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?
The description implies this tool is for listing farms, but it does not explicitly state when to use it versus alternatives or when not to use it. Context is clear enough for a simple resource-list operation, but exclusionary guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_summaryARead-onlyIdempotent
[READ] One-glance Horizon VDI health: session totals by state, problem machines, pool availability.
The first thing to call for "how is VDI right now?". Aggregates sessions, machines, and pools into a compact status. Drill into problems with machine_list --state or session_list.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description need not repeat those. It adds behavioral context by stating it 'aggregates sessions, machines, and pools into a compact status,' which goes beyond the annotations. It also hints at the return content (session totals, problem machines, pool availability), though it does not detail format or pagination—acceptable given the read-only, idempotent nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The core summary is front-loaded, and the drill-down guidance follows naturally. Every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only summary tool with no output schema, the description adequately covers what it returns and how to proceed. It mentions the aggregated categories and points to follow-up tools. It does not mention limits like time ranges or defaults beyond what the schema covers, but these are not critical for a health summary. 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?
The single parameter 'target' is fully described in the schema ('Horizon target from config.yaml; omit to use the default.'), so schema coverage is 100%. The description adds no further parameter semantics, which is fine—the baseline of 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose: 'One-glance Horizon VDI health: session totals by state, problem machines, pool availability.' It names the resource (Horizon VDI) and the aggregated content, and distinguishes itself from siblings by positioning as the 'first thing to call for how is VDI right now?' and pointing to drill-down tools like machine_list and session_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?
Explicitly tells when to use it ('first thing to call for how is VDI right now?') and when to use alternatives ('Drill into problems with machine_list --state or session_list'). This gives clear routing and avoids confusion with the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
image_listARead-onlyIdempotent
[READ] List instant-clone base VMs and snapshots (the golden-image catalog for pool_push_image).
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| base_vm_id | No | Optionally scope snapshots to one base VM. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the behavioral context that this lists the golden-image catalog specifically for pool_push_image, which is useful. However, it doesn't disclose details like whether snapshots are returned hierarchically, whether base_vm_id filtering changes the shape, or pagination/limits. With annotations covering safety, a 3 is appropriate.
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 that front-loads the action and resource, then adds the key contextual link to pool_push_image. Zero waste, and the [READ] prefix is a useful signal. Every word 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 read-only list tool with 2 optional parameters, full schema coverage, and annotations covering safety, the description is nearly complete. The only minor gap is not describing the return shape (e.g., whether it returns both base VMs and snapshots in one list or separately), but with no output schema and a simple list operation, this is a minor omission.
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 both parameters (target and base_vm_id) are already documented in the schema. The description adds the context that base_vm_id scopes snapshots to one base VM, which aligns with the schema. It doesn't add syntax or format details 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?
The description states a specific verb ('List') and resource ('instant-clone base VMs and snapshots'), and explicitly frames it as the golden-image catalog for pool_push_image. This clearly distinguishes it from sibling tools like machine_list or pool_list, and the [READ] prefix reinforces the read-only nature.
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 this tool: when you need the golden-image catalog for pool_push_image. It doesn't explicitly name alternatives or exclusions, but the reference to pool_push_image provides clear context for when this tool is relevant. Sibling tools like machine_list and pool_list are distinct enough that an agent can infer the appropriate choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
machine_getARead-onlyIdempotent
[READ] One Horizon desktop machine by id (teaching 404 on a wrong id).
Same projection as one machine_list row — id, name, pool_id, state, assigned user, agent_version, base_image — fetched with a single GET instead of scanning the estate. Use it to re-check one machine after a write, or when you already hold an id.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| machine_id | Yes | Horizon machine id (the opaque 'id' of a machine_list row, not the desktop's display name and not the vCenter VM name). A wrong id returns a 404 whose hint tells you to re-run machine_list for exact ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnly/idempotent annotations by disclosing the 404 behavior on wrong ids, enumerating the return projection (id, name, pool_id, state, assigned user, agent_version, base_image), and clarifying that it uses a single GET rather than a list scan. This is valuable behavioral context not available 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?
The description is compact and front-loaded, with the core read action in the first sentenceair quotes and supporting context in the next two sentences. There is no fluff; every phrase contributes to selection, invocation, or error understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-fetch tool with two parameters nhỏ, the description covers purpose, when to use it, behavior on wrong ids, and the full return shape despite the lack of an output schema. The optional target parameter is fully documented in the input schema, so 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 100%, and the schema already explains machine_id as an opaque id, not a display name or vCenter VM name, with the 404 hint. The main description doesn't add much beyond confirming the id comes from a machine_list row, so a 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 opens with '[READ] One Horizon desktop machine by id', naming a specific verb, resource, and lookup method. It also distinguishes itself from machine_list by explicitly saying it fetches one row instead of scanning the estate, making sibling differentiation 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?
It gives explicit when-to-use guidance: 're-check one machine after a write, or when you already hold an id.' It also contrasts with machine_list by noting the same projection is fetched with a single GET 'instead of scanning the estate', and the schema's wrong-id hint tells the agent to re-run machine_list for exact ids.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
machine_listARead-onlyIdempotent
[READ] List Horizon desktop machines, filtered by pool id / state. Paginated.
Each item: id, name, pool_id, state (AVAILABLE/CONNECTED/AGENT_UNREACHABLE/PROVISIONING/ ERROR/MAINTENANCE/…), assigned user, agent_version, base_image. Verify pair for the machine write tools.
| Name | Required | Description | Default |
|---|---|---|---|
| pool | No | Filter to one desktop-pool id. | |
| limit | No | Page size (default 50). | |
| state | No | Filter by machine state (e.g. AGENT_UNREACHABLE, ERROR). | |
| offset | No | Page offset. | |
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds value beyond that by mentioning pagination, the output fields (id, name, pool_id, state, etc.), and the filter behavior. It reinforces the read-only nature with '[READ]' and clarifies the state enumeration, which helps set expectations without contradicting any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the key purpose and read-only marker. It then lists the returned fields and a usage hint in a second paragraph, with no fluff. Every sentence adds value, and the structure aids quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list operation with all optional parameters and no output schema, the description covers the essential aspects: what it lists, filters, pagination, output fields, and a usage context. The schema covers parameter details, so the description is complete for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage with descriptions for all five parameters, so the description does not need to add much. It does confirm that filtering is by pool and state, which matches the schema, but does not introduce new semantic detail beyond what the parameter descriptions already offer. A 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 states a clear verb ('List') and resource ('Horizon desktop machines'), specifies filters (pool id/state), and notes pagination. It distinguishes itself from sibling machine_get (single item) and write tools by explicitly labeling as a read operation with '[READ]' and the verification hint.
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 contextual guidance by noting 'Verify pair for the machine write tools', implying use before writes. However, it does not explicitly compare to machine_get or other list tools (e.g., pool_list), leaving some when-to-use/alternative distinctions to inference. Still, the purpose is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
machine_maintenanceAIdempotent
[WRITE] Enter (enabled=True) or exit (False) maintenance mode for machine(s).
Maintenance drains the machine (no new sessions). A bare call returns blast_radius (machine ids, states, assigned users) and changes nothing; confirm=True applies. A machine whose state cannot be read is refused. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True applies it. | |
| enabled | Yes | True enters maintenance; False exits. | |
| machine_ids | Yes | Machine ids (from machine_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the two-phase behavior, the exact contents of blast_radius, that a bare call changes nothing, that unreadable machines are refused, and that the operation is audited. This aligns with readOnlyHint=false and idempotentHint=true rather than contradicting them.
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 core action, and each following sentence carries essential operational or safety information. There is no filler or repetition; the length is appropriate for a two-phase mutation with significant safety implications.
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 no output schema, the description does explain the blast_radius return value for the read-only first call, plus refusal and audit behavior. A minor gap remains: what the caller should expect after confirm=True applies is not described, and the fate of existing sessions is only implied by 'no new sessions.'
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 baseline is 3. The description restates the enabled and confirm semantics already present in the schema and adds a safety policy, but it does not materially expand parameter meanings beyond what the input schema documents.
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-resource pair: 'Enter (enabled=True) or exit (False) maintenance mode for machine(s).' It also clarifies the operational effect, 'Maintenance drains the machine (no new sessions),' which distinguishes this from sibling machine mutators like machine_reset or machine_remove.
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 explicit procedural guidance: call without confirm to inspect blast_radius, show the user, wait for their decision, and never auto-confirm before the user has seen the blast radius. It does not explicitly list when-not-to-use or name alternative tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
machine_removeADestructive
[WRITE] Remove machine(s) from their pool — for instant clones this DELETES the backing VM.
A bare call returns blast_radius (machine ids, names, states, assigned users) and removes nothing; confirm=True removes. A machine whose state cannot be read is refused. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True removes. | |
| machine_ids | Yes | Machine ids to remove (from machine_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds critical behavioral context: the two-phase confirm flow, the blast_radius return payload, refusal when a machine state cannot be read, and the 'Audited' note. It also explicitly warns about the irreversible deletion of backing VMs for instant clones. This goes well beyond the 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 compact and front-loaded: the destructive warning comes first, then the two-phase behavior, then the refusal condition, then the user-decision instruction. Every sentence earns its place, and the 'Audited' note is a useful one-word signal. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description is remarkably complete: it explains the return value (blast_radius), the confirmation flow, the refusal edge case, and the irreversible consequence. An agent has everything needed to call it safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning by explaining the confirm parameter's two-phase behavior (false returns blast radius, true removes) and clarifies machine_ids come from machine_list. It doesn't add much on target, but the schema already covers it. This is a solid enhancement 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?
The description opens with a specific verb and resource ('Remove machine(s) from their pool') and immediately distinguishes the destructive consequence for instant clones ('DELETES the backing VM'). It clearly separates from siblings like machine_reset and machine_maintenance by focusing on removal and deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: a bare call returns blast_radius and removes nothing; confirm=True removes. It instructs the agent to show blast_radius to the user and wait for their decision, and explicitly warns not to set confirm=True on its own even if the user asked earlier. This is strong, actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
machine_resetADestructive
[WRITE] Hard-reset desktop machine(s) — the user loses unsaved state.
A bare call returns blast_radius (machine ids, names, states, assigned users) and resets nothing; confirm=True resets. A machine whose state cannot be read is refused. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. For a graceful in-guest reboot use vmware-aiops (the vCenter VM). Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True resets. | |
| machine_ids | Yes | Machine ids to reset (from machine_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-read-only, but the description adds substantial context beyond that: the two-phase confirm behavior, the refusal to reset machines whose state cannot be read, the expectation to show blast_radius to the user, the warning not to self-confirm, and the 'Audited' note. This gives the agent a clear mental model of the tool's safety envelope.
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?
Every sentence earns its place: core operation first, then the two-phase workflow, then the user-consent warning, then the alternative tool. Densely informative with no filler or repetition of schema content, and the most safety-critical guidance 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 description fully equips an agent to call this tool correctly despite the absence of an output schema: it explains exactly what a bare call returns (blast_radius with machine ids, names, states, assigned users), how confirmation works, what can cause refusal, and when to route to a different tool. Nothing critical 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 100%, and the schema already explains confirm's false/true semantics, machine_ids source, and target default. The description reinforces the confirm behavior but does not add new parameter-level meaning beyond what the schema provides. 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?
The description opens with a specific verb and resource: 'Hard-reset desktop machine(s)' and immediately states the consequence ('user loses unsaved state'). This clearly distinguishes it from siblings like machine_remove or machine_maintenance, and the explicit contrast with vmware-aiops further disambiguates it from graceful reboot operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit workflow instructions: a bare call returns blast_radius and resets nothing, confirm=True resets, and the agent must show blast_radius and wait for user decision before setting confirm. It also names an alternative tool for graceful reboots (vmware-aiops), making the when-to-use vs when-not-to-use boundary explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pool_getARead-onlyIdempotent
[READ] One desktop pool by id (teaching 404 on a wrong id).
Same projection as one pool_list row — id, name, type, enabled, provisioning_enabled, assignment — fetched with a single GET instead of listing every pool. Use it to re-check one pool after a write, or when you already hold an id.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| pool_id | Yes | Horizon desktop-pool id (the opaque 'id' of a pool_list row, not the pool's display name). A wrong id returns a 404 whose hint tells you to re-run pool_list for exact ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive. The description adds useful context beyond annotations: a wrong id returns 404, the response projection matches pool_list rows, and the operation is a single cheap GET. No contradiction with 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 sentences fully carry the purpose, projection, error behavior, and usage guidance with no filler. The [READ] tag and core statement are front-loaded, and the field list earns its place because there is no output 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?
For a simple getter with no output schema, the description covers what is returned, the error case, the usage decision, and relation to pool_list. The input schema fully documents both parameters, so nothing needed to invoke the tool correctly 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 already explains that pool_id is the opaque id from pool_list and that a wrong id returns a 404. The description adds little beyond 'by id' and 'already hold an id,' so the 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?
The opening '[READ] One desktop pool by id' gives a specific verb, resource, and scope agenda. The note that it returns the same projection as a pool_list row distinguishes it from pool_list, machine_get, and session_get without requiring any of those 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?
It gives explicit decision rules: use it to re-check a pool after a write, or when an id is already held. It also contrasts with the alternative by saying it uses a single GET instead of listing every pool, so an agent knows when not to call pool_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pool_listARead-onlyIdempotent
[READ] List Horizon desktop pools: id, name, type (AUTOMATED/MANUAL/RDS), enabled, assignment.
The verify pair for pool_set_enabled and pool_push_image. Paginated envelope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 50). | |
| offset | No | Page offset. | |
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the [READ] prefix confirms safety. The description adds the type field enumeration and the paginated envelope note, which clarifies the return structure. It does not detail pagination behavior, but given the annotations cover the read-only nature, this is sufficient.
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 with no waste. It front-loads the [READ] prefix and the verb 'List', then enumerates fields concisely. The second sentence adds a critical functional relationship and the pagination note in a compact way. Every word contributes.
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 list tool with three optional parameters and full schema coverage, the description is complete. It tells the agent what it returns, the type values, and its role in verification. The output schema is absent, but the field list compensates. Nothing missing 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?
The schema description coverage is 100%, so each parameter (limit, offset, target) is already documented in the schema. The description only adds the pagination envelope concept, which is minimal. The description does not add extra semantics beyond what the schema provides, so a baseline score 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 clearly states it lists Horizon desktop pools and enumerates the fields returned (id, name, type, enabled, assignment). It also mentions the type values (AUTOMATED/MANUAL/RDS), which distinguishes it from app_pool_list and other list variants. The verb 'List' plus the resource and scope is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states it is the 'verify pair' for two sibling tools: pool_set_enabled and pool_push_image. This gives clear guidance on when to use this tool (to verify changes) and implicitly distinguishes it from other list tools. There is no direct alternative named, but the relationship to specific siblings is stated, which is more than typical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pool_push_imageADestructive
[WRITE] Apply the pending image to an instant-clone pool — RECREATES EVERY DESKTOP in it.
Highest blast radius in the family: the preview states affected-desktop and in-session counts before you confirm, plus blast_radius.occupancy — "determined" when those counts can be believed, "unknown" when sessions exist that cannot be attributed to any pool or farm. confirm=True schedules the apply. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True schedules the push. | |
| pool_id | Yes | The pool id (from pool_list). | |
| logoff_policy | No | WAIT_FOR_LOGOFF (default) or FORCE_LOGOFF. | WAIT_FOR_LOGOFF |
| stop_on_error | No | Halt the rolling push on the first machine error (default True). | |
| acknowledge_unknown_occupancy | No | Only consulted when the preview reports blast_radius.occupancy == "unknown", where in_session_count is a lower bound rather than a count and confirm=True is refused. Setting it True pushes on an unverified occupancy — check session_list first; the acknowledgement is recorded in the audit row. Ignored when occupancy is "determined". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds critical behavioral detail: every desktop is recreated, confirm=False is a no-op preview, confirm=True schedules the destructive action, occupancy can be 'determined' or 'unknown', and the operation is audited. No contradiction with the 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 dense but every sentence earns its place: the destructive warning is front-loaded, the preview/confirm protocol is explicit, and the closing 'Audited.' adds useful context without padding. It is appropriately sized for a high-risk operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description does a good job explaining preview fields, occupancy semantics, and the confirmation flow. It is slightly incomplete in that it does not state what confirm=True returns after scheduling, such as a task identifier or how the agent should monitor the resulting operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by tying confirm and acknowledge_unknown_occupancy to the blast_radius occupancy states and the required user-decision protocol, which clarifies their real-world semantics. The remaining parameters are adequately explained by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Apply the pending image to an instant-clone pool') and immediately escalates the risk with 'RECREATES EVERY DESKTOP' and 'Highest blast radius in the family.' This makes the tool's purpose and scope unmistakable and separates it from lower-impact pool or machine operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit workflow: call with confirm=False to preview, show blast_radius to the user, wait for their decision, and only then set confirm=True. It also explicitly warns not to confirm autonomously because the user has not yet seen the blast radius, which is exactly the kind of when-not-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pool_set_enabledAIdempotent
[WRITE] Enable or disable a desktop pool — disabling stops NEW sessions (existing keep running).
Idempotent (matching state returns a noop). A bare call returns blast_radius (pool identity, current and new enabled state) and changes nothing; confirm=True applies. A pool whose current enabled state cannot be read is refused. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True applies it. | |
| enabled | Yes | True enables; False disables. | |
| pool_id | Yes | The pool id (from pool_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=true), the description discloses the confirmation workflow, idempotent noop behavior, refusal when current state cannot be read, and the audited nature of the call. This is exactly the behavioral context an agent needs for a mutation with side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and effect, and every subsequent sentence earns its place: idempotency, blast_radius workflow, refusal condition, and user-consent rule. It is information-dense without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema, the description covers the return contract (blast_radius contents), the confirmation semantics, the failure case (cannot read current state), and the safety requirement of user consent. This is complete enough for an agent 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 the schema already documents target, confirm, enabled, and pool_id. The description adds meaningful semantics for confirm (bare call returns blast_radius and changes nothing; True applies it), and clarifies the enabled effect, which goes slightly beyond the schema's one-line descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '[WRITE] Enable or disable a desktop pool' and clearly states the behavioral scope ('disabling stops NEW sessions (existing keep running)'). This distinguishes it from sibling pool_list/pool_get/pool_push_image and leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit operational guidance: a bare call only returns blast_radius, confirm=True applies the change, and the agent must 'Show blast_radius to the user and wait for their decision.' It even states a when-not ('Do not set confirm=True on your own because the user asked for this earlier'), which is more actionable than a generic alternative comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pool_utilizationARead-onlyIdempotent
[READ] Per-pool capacity: total / available / in-use / error machines and utilization %.
The "am I running out of desktops?" view, sorted by utilization. Drill in with machine_list --pool.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context beyond annotations: it states the output is sorted by utilization and specifies the exact metrics included. It also hints at a drill-down workflow. This provides useful behavioral detail without contradicting 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 with zero fluff. The core purpose and metrics are front-loaded, followed by a use case and a drill-in pointer. Every word earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with one optional parameter and no output schema, the description adequately conveys the return content (capacity metrics and utilization %) and provides a usage context. It does not cover potential error conditions or edge cases, but given the simplicity and annotations, this is sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter 'target', which is well-described in the schema ('Horizon target from config.yaml; omit to use the default.'). The tool description does not add any parameter-specific information, but the schema already fully documents it. 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 states a specific verb ('Per-pool capacity') and resource ('pool'), lists the exact metrics (total/available/in-use/error machines and utilization %), and explicitly differentiates from sibling machine_list by suggesting drill-in. It clearly conveys what the tool returns and how it differs from related 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?
The description gives a clear use case ('am I running out of desktops?' view) and explicitly points to machine_list for drill-in, which helps an agent decide when to use this vs. a deeper dive. However, it does not explicitly contrast with other siblings like pool_list or health_summary, so it lacks full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_disconnectADestructive
[WRITE] Disconnect Horizon session(s) — state preserved, the user can reconnect.
Less disruptive than logoff. Identify by session_ids OR user. A bare call returns blast_radius (session ids, count, affected users) and changes nothing; confirm=True disconnects. A session whose user cannot be read is refused. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Disconnect all sessions of this AD user (substring match). | |
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True disconnects. | |
| session_ids | No | Session ids to disconnect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description reveals important behaviors: state is preserved, reconnection is allowed, a bare call is non-destructive, sessions with unreadable users are refused, and the operation is audited. This contextualizes the destructiveness and gives the agent a safe interaction pattern.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: the action and key behavior in the first line, the distinction from logoff, the safe-call workflow, the refusal edge case, and the user-consent directive. It is front-loaded with the essential purpose and safety 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?
For a destructive tool without an output schema, the description covers everything an agent needs to invoke it correctly: how to identify targets, what the default call does, how to get consent, what happens on refusal, and auditability. The target parameter is documented in the schema, so no critical gap remains.
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 adds meaning by clarifying the relationship between session_ids and user ('Identify by session_ids OR user') and by explaining the confirm parameter's effect (bare call vs. actual disconnect). This goes slightly beyond the 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 opens with a specific verb and resource: 'Disconnect Horizon session(s)'. It immediately distinguishes itself from the sibling 'logoff' by noting state is preserved and the user can reconnect, so an agent can tell it apart from session_logoff without opening that tool's definition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly contrasts with logoff ('Less disruptive than logoff') and details the safe usage workflow: a bare call returns blast_radius without side effects, the agent should show this to the user and wait, and confirm=True should only be set after user approval. This is actionable when-to-use guidance that prevents premature destructive action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_getARead-onlyIdempotent
[READ] Full detail for one Horizon session by id.
A wrong id returns a teaching error ("run session_list for current ids"), not a traceback. Use session_list to discover ids.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| session_id | Yes | The session id (from session_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world traits. The description adds meaningful behavioral context beyond this: a wrong id returns a teaching error rather than a traceback, which helps the agent anticipate error behavior and recovery steps.
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: it states the operation in the first sentence, then adds the useful error-behavior and id-discovery guidance. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with a fully documented schema and no output schema, the description is complete: it explains what the tool returns conceptually, how to obtain a valid id, and what happens on failure. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both session_id and target fully. The description reinforces that session_id comes from session_list but does not add meaning beyond what the schema already provides, 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 states a specific operation: retrieving full detail for one Horizon session by id. It distinguishes itself from sibling list tools by emphasizing 'one session' and 'full detail', and it points to session_list for id discovery, so an agent can tell this tool apart from nearby alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent to use session_list to discover ids, which covers the key prerequisite and primary alternative. It also frames the tool as the correct choice when full detail for a single known session is needed, giving clear contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_listARead-onlyIdempotent
[READ] List Horizon VDI sessions, filtered by user / pool id / state. Paginated.
Returns a {items, returned, limit, total, truncated, hint} envelope; each item has id, user, type (DESKTOP/APPLICATION), state (CONNECTED/DISCONNECTED/PENDING), protocol (BLAST/PCOIP/RDP), pool_id, machine_id, start_time. This is the verify pair for logoff/disconnect — get a session id or confirm a user's sessions here first.
| Name | Required | Description | Default |
|---|---|---|---|
| pool | No | Exact desktop-pool / farm id. | |
| user | No | Substring-match the AD user name. | |
| limit | No | Page size (default 50). | |
| state | No | CONNECTED, DISCONNECTED, or PENDING. | |
| offset | No | Page offset. | |
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive. Description adds the return envelope shape and field enumeration, plus pagination. It also states the READ nature upfront. That adds context beyond annotations, though it doesn't discuss any edge cases like empty results or errors.
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 [READ] and purpose, then compact return spec. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated list with rich output spec, the description is complete: it explains the envelope, item fields, and the verify use-case. Given annotations cover safety, nothing critical 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 covers all 6 parameters with descriptions (100% coverage). Description summarizes filters but doesn't add new meaning beyond what schema provides; 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 'List' and resource 'Horizon VDI sessions', with explicit filters (user/pool/state) and pagination. Distinguishes from siblings by calling itself the 'verify pair' for logoff/disconnect, so the agent knows it's the listing tool for those actions.
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 tells when to use it: 'This is the verify pair for logoff/disconnect — get a session id or confirm a user's sessions here first.' This gives clear context for when to invoke it, though it doesn't list alternatives or exclusions. Still, it's strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_logoffADestructive
[WRITE] Force-logoff Horizon session(s) — kicks the user, triggers profile write-back.
Identify targets by explicit session_ids OR by user (all of that user's sessions). A bare call returns blast_radius — session ids, count and affected users — and logs off nothing; confirm=True logs off. A session whose user cannot be read is refused. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Log off all sessions of this AD user (substring match); refuses if none match. | |
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True logs off. | |
| session_ids | No | Session ids to log off (from session_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive/readOnly annotations, the description discloses the write-back trigger, the safe dry-run blast radius behavior, the refusal condition for unreadable users, and the audit trail. This is substantial behavioral 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?
The description is front-loaded with the core operation and side effect, then packs target selection, confirmation semantics, user-consent requirement, and audit status into a compact block. Every sentence earns its place with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, the description is complete: it explains the safe default, what the blast radius contains, how to confirm, when a call is refused, and that the operation is audited. An agent has everything needed to invoke it correctly and safely.
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 parameter descriptions already cover substring matching, session_list origin, blast-radius behavior, and default target. The description adds little parameter-level meaning beyond reinforcing the session_ids-or-user choice, 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 clearly identifies the action (force-logoff), the resource (Horizon sessions), and the side effect (kicks the user, triggers profile write-back), with target identification by session_ids or user. It doesn't explicitly name or contrast session_disconnect, but the 'force-logoff/write-back' framing is specific enough to avoid confusion with the disconnect 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?
It gives explicit workflow guidance: bare call returns blast radius, confirm=True performs the logoff, show blast radius to user, and do not set confirm=True unilaterally. It doesn't explicitly state when to prefer this over session_disconnect or other siblings, so it stops short of a full when/when-not comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_send_messageA
[WRITE] Send a message to Horizon session(s) — e.g. "save your work, maintenance in 10 min".
Low blast radius (informational only, no session disruption), so no confirm gate. Identify by session_ids OR user. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Message all sessions of this AD user (substring match). | |
| target | No | Horizon target from config.yaml; omit to use the default. | |
| message | Yes | The text to display to the user(s). | |
| session_ids | No | Session ids to message. | |
| message_type | No | INFO, WARNING, or ERROR. | INFO |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description adds meaningful behavioral context: "low blast radius", "informational only, no session disruption", "no confirm gate", and "Audited." These details are not inferable from readOnlyHint=false and destructiveHint=false 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?
The description is compact and front-loaded: the action, an example, risk level, targeting rule, and audit note all fit in three short sentences. Every sentence earns its place with no fluff or repetition of 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?
For a write operation with 100% schema coverage and no output schema, the description covers the important behavioral context: how to identify recipients, why confirmation is not needed, and why this is safe. It does not mention response behavior, but that is largely unnecessary for a message-sending tool and the schema already documents all 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 100%, so the baseline is 3. The description adds value on top by clarifying the targeting relationship between session_ids and user, and reinforces the message text semantics with an example. This lifts it slightly above 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?
The description begins with a specific verb+resource pattern: "Send a message to Horizon session(s)" and includes a concrete example message. It also distinguishes itself from disruptive sibling actions like session_logoff or session_disconnect by explicitly labeling this as informational-only.
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 states how to target sessions via "session_ids OR user", provides a realistic use case, and explains that no confirm gate is needed. It does not explicitly enumerate when not to use this tool versus alternatives like session_logoff, but the informational framing makes the intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_statsARead-onlyIdempotent
[READ] Session statistics: concurrency by state / protocol, current concurrent, busiest pools.
The reporting counterpart to session_list — aggregate numbers, not per-session rows.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered by structured data. The description adds the output nature (aggregate statistics) but does not disclose additional behavioral details such as data freshness, scoping semantics, or failure conditions, which is acceptable given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences with no filler. The [READ] marker and primary summary are front-loaded, and the sibling contrast is placed in the second sentence, making the essential information immediately visible.
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 read-only tool with one optional parameter and no output schema, the description adequately lists the return categories (concurrency by state/protocol, current concurrent, busiest pools). It does not specify the exact output structure, but the listed categories give an agent sufficient expectations for a straightforward stats call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single optional target parameter is fully described with a default and usage guidance. The tool description adds no parameter-level detail, but the schema already carries that burden, so the baseline score 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 exactly what the tool provides: session statistics covering concurrency by state/protocol, current concurrent count, and busiest pools. It further distinguishes itself from session_list by clarifying it returns aggregate numbers, not per-session rows, making its purpose 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?
The description explicitly names session_list as the reporting counterpart and contrasts aggregate numbers with per-session rows, giving an agent a clear decision point. It does not cover when to use other reporting siblings like pool_utilization or health_summary, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_cancelADestructive
[WRITE] Cancel a running pool task (e.g. an in-progress image push).
A bare call reads the task and returns blast_radius (task type, state, progress) and cancels nothing; confirm=True cancels. A task whose type or state cannot be read is refused. Work already applied is not rolled back. Show blast_radius to the user and wait for their decision. Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet. Audited.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| confirm | No | False (default) returns the blast radius and changes nothing. True cancels. | |
| pool_id | Yes | The desktop-pool id. | |
| task_id | Yes | The task id (from task_status). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations marking destructiveHint=true, the description adds material behavioral context: bare call cancels nothing, confirm=True is required, unreadable tasks are refused, and already-applied work is not rolled back. The "Audited" note also signals operational oversight. This goes well beyond what the annotations alone 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?
The description is front-loaded with the action and then uses compact, purposeful sentences to explain the workflow, safety guardrails, and error conditions. Every sentence contributes value, and the formatting keeps the two-phase behavior easy to follow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the critical return for a bare call (blast_radius with type, state, progress), the cancellation trigger, refusal conditions, and non-rollback. With no output schema, it could more explicitly state what confirm=True returns after cancellation, which is the main minor gap. Overall it is complete enough for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains all four parameters, including confirm's default/false behavior and target's default. The description reinforces confirm semantics but does not add new parameter-level meaning beyond what the schema provides. This meets the baseline but does not exceed it.
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 action and resource: "Cancel a running pool task" with an example (image push). It also clarifies the two-phase nature of the tool (read blast radius vs. actually cancel), which removes ambiguity about what a bare call does. Sibling tools like task_status or pool_push_image are clearly distinct from this cancellation operation.
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?
Explicit guidance covers when to use the bare call vs. confirm=True, and includes a firm when-not: "Do not set confirm=True on your own because the user asked for this earlier: they have not seen the blast radius yet." It also states the refusal condition when task type/state cannot be read, giving the agent concrete guardrails for invoking the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_statusARead-onlyIdempotent
[READ] Status of a pool's long task (image push / provisioning), or all tasks for the pool.
Horizon tasks are pool-scoped. Give task_id (from pool_push_image or a prior task_status) for one task; omit it to list all tasks for the pool.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Horizon target from config.yaml; omit to use the default. | |
| pool_id | Yes | The desktop-pool id. | |
| task_id | No | A specific task id; omit to list all tasks for the pool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description doesn't need to cover safety. It adds valuable behavioral context: tasks are pool-scoped, and the tool supports two modes (single task vs. all tasks). It also reinforces the read-only nature with '[READ]'. No contradictions with 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 a compact three-sentence block, front-loaded with '[READ]' to immediately signal it's a read operation. Every sentence adds value: the scope, the parameter usage, and the source of task_id. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only status tool with no output schema, the description provides essential context: what kind of tasks (long tasks like image push/provisioning), how tasks are scoped, and how to select between single vs. all tasks. It doesn't describe the return format, but that's often acceptable for status tools, and the tool name implies a status response. Overall, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds extra meaning beyond the schema: it specifies that task_id should come from pool_push_image or a prior task_status, and clarifies the omit-to-list-all behavior (already in schema but reinforced). It doesn't add detail for target or pool_id beyond what the schema provides, but the added task_id context is useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports the status of a pool's long task (image push/provisioning) or all tasks for the pool. It uses a specific verb ('Status') and resource ('pool's long task'), and distinguishes itself from siblings like task_cancel by focusing on reading rather than modifying tasks. The pool-scoping detail further clarifies its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to include task_id vs. omit it, and even mentions the source of a valid task_id (from pool_push_image or a prior task_status). It implies that for creating tasks you use pool_push_image and for canceling you use task_cancel, though it doesn't name these alternatives directly. It's clear when to use this tool, but doesn't state explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v1.2.0- Changed
entitlement_add1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True grants."New value: +"False (default) returns the blast radius and changes nothing. True grants."
- Changed
entitlement_remove1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True revokes."New value: +"False (default) returns the blast radius and changes nothing. True revokes."
- Changed
machine_maintenance1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True applies."New value: +"False (default) returns the blast radius and changes nothing. True applies it."
- Changed
machine_remove1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True removes."New value: +"False (default) returns the blast radius and changes nothing. True removes."
- Changed
machine_reset1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True resets."New value: +"False (default) returns the blast radius and changes nothing. True resets."
- Changed
pool_push_image1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews the blast radius; True schedules the push."New value: +"False (default) returns the blast radius and changes nothing. True schedules the push."
- Changed
pool_set_enabled1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True applies."New value: +"False (default) returns the blast radius and changes nothing. True applies it."
- Changed
session_disconnect1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True disconnects."New value: +"False (default) returns the blast radius and changes nothing. True disconnects."
- Changed
session_logoff1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True logs off."New value: +"False (default) returns the blast radius and changes nothing. True logs off."
- Changed
task_cancel1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"False previews; True cancels."New value: +"False (default) returns the blast radius and changes nothing. True cancels."
27 tool updates
v1.1.1- Changed
ad_user_search4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Max principals to return (default 25)." - added
Input schema / properties / name / descriptionAdded value: +"Name substring to search for." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
app_pool_list4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Page size (default 50)." - added
Input schema / properties / offset / descriptionAdded value: +"Page offset." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
entitlement_add5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / ad_user_or_group_ids / descriptionAdded value: +"AD SIDs to entitle (from ad_user_search)." - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True grants." - added
Input schema / properties / pool_id / descriptionAdded value: +"The desktop-pool id (from pool_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
entitlement_list5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Page size (default 50)." - added
Input schema / properties / offset / descriptionAdded value: +"Page offset." - added
Input schema / properties / pool_id / descriptionAdded value: +"The desktop-pool id (from pool_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
entitlement_remove5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / ad_user_or_group_ids / descriptionAdded value: +"AD SIDs to remove (from entitlement_list)." - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True revokes." - added
Input schema / properties / pool_id / descriptionAdded value: +"The desktop-pool id (from pool_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
event_list5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Page size (default 50)." - added
Input schema / properties / offset / descriptionAdded value: +"Page offset." - added
Input schema / properties / severity / descriptionAdded value: +"Filter by severity (e.g. ERROR, WARNING, AUDIT_FAIL)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
farm_list4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Page size (default 50)." - added
Input schema / properties / offset / descriptionAdded value: +"Page offset." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
health_summary2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
image_list3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / base_vm_id / descriptionAdded value: +"Optionally scope snapshots to one base VM." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
machine_get3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / machine_id / descriptionAdded value: +"Horizon machine id (the opaque 'id' of a machine_list row, not the desktop's display name and not the vCenter VM name). A wrong id returns a 404 whose hint tells you to re-run machine_list for exact ids." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
machine_list6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Page size (default 50)." - added
Input schema / properties / offset / descriptionAdded value: +"Page offset." - added
Input schema / properties / pool / descriptionAdded value: +"Filter to one desktop-pool id." - added
Input schema / properties / state / descriptionAdded value: +"Filter by machine state (e.g. AGENT_UNREACHABLE, ERROR)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
machine_maintenance5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True applies." - added
Input schema / properties / enabled / descriptionAdded value: +"True enters maintenance; False exits." - added
Input schema / properties / machine_ids / descriptionAdded value: +"Machine ids (from machine_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
machine_remove4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True removes." - added
Input schema / properties / machine_ids / descriptionAdded value: +"Machine ids to remove (from machine_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
machine_reset4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True resets." - added
Input schema / properties / machine_ids / descriptionAdded value: +"Machine ids to reset (from machine_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
pool_get3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / pool_id / descriptionAdded value: +"Horizon desktop-pool id (the opaque 'id' of a pool_list row, not the pool's display name). A wrong id returns a 404 whose hint tells you to re-run pool_list for exact ids." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
pool_list4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Page size (default 50)." - added
Input schema / properties / offset / descriptionAdded value: +"Page offset." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
pool_push_image7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / acknowledge_unknown_occupancyAdded value: +{ + "default": false, + "description": "Only consulted when the preview reports blast_radius.occupancy == \"unknown\", where in_session_count is a lower bound rather than a count and confirm=True is refused. Setting it True pushes on an unverified occupancy — check session_list first; the acknowledgement is recorded in the audit row. Ignored when occupancy is \"determined\".", + "title": "Acknowledge Unknown Occupancy", + "type": "boolean" +} - added
Input schema / properties / confirm / descriptionAdded value: +"False previews the blast radius; True schedules the push." - added
Input schema / properties / logoff_policy / descriptionAdded value: +"WAIT_FOR_LOGOFF (default) or FORCE_LOGOFF." - added
Input schema / properties / pool_id / descriptionAdded value: +"The pool id (from pool_list)." - added
Input schema / properties / stop_on_error / descriptionAdded value: +"Halt the rolling push on the first machine error (default True)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
pool_set_enabled5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True applies." - added
Input schema / properties / enabled / descriptionAdded value: +"True enables; False disables." - added
Input schema / properties / pool_id / descriptionAdded value: +"The pool id (from pool_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
pool_utilization2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
session_disconnect5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True disconnects." - added
Input schema / properties / session_ids / descriptionAdded value: +"Session ids to disconnect." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default." - added
Input schema / properties / user / descriptionAdded value: +"Disconnect all sessions of this AD user (substring match)."
- Changed
session_get3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / descriptionAdded value: +"The session id (from session_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
session_list7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Page size (default 50)." - added
Input schema / properties / offset / descriptionAdded value: +"Page offset." - added
Input schema / properties / pool / descriptionAdded value: +"Exact desktop-pool / farm id." - added
Input schema / properties / state / descriptionAdded value: +"CONNECTED, DISCONNECTED, or PENDING." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default." - added
Input schema / properties / user / descriptionAdded value: +"Substring-match the AD user name."
- Changed
session_logoff5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True logs off." - added
Input schema / properties / session_ids / descriptionAdded value: +"Session ids to log off (from session_list)." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default." - added
Input schema / properties / user / descriptionAdded value: +"Log off all sessions of this AD user (substring match); refuses if none match."
- Changed
session_send_message6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / message / descriptionAdded value: +"The text to display to the user(s)." - added
Input schema / properties / message_type / descriptionAdded value: +"INFO, WARNING, or ERROR." - added
Input schema / properties / session_ids / descriptionAdded value: +"Session ids to message." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default." - added
Input schema / properties / user / descriptionAdded value: +"Message all sessions of this AD user (substring match)."
- Changed
session_stats2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default."
- Changed
task_cancel5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / confirm / descriptionAdded value: +"False previews; True cancels." - added
Input schema / properties / pool_id / descriptionAdded value: +"The desktop-pool id." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default." - added
Input schema / properties / task_id / descriptionAdded value: +"The task id (from task_status)."
- Changed
task_status4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / pool_id / descriptionAdded value: +"The desktop-pool id." - added
Input schema / properties / target / descriptionAdded value: +"Horizon target from config.yaml; omit to use the default." - added
Input schema / properties / task_id / descriptionAdded value: +"A specific task id; omit to list all tasks for the pool."
27 tool updates
v1.0.1- First observed
ad_user_search - First observed
app_pool_list - First observed
entitlement_add - First observed
entitlement_list - First observed
entitlement_remove - First observed
event_list - First observed
farm_list - First observed
health_summary - First observed
image_list - First observed
machine_get - First observed
machine_list - First observed
machine_maintenance - First observed
machine_remove - First observed
machine_reset - First observed
pool_get - First observed
pool_list - First observed
pool_push_image - First observed
pool_set_enabled - First observed
pool_utilization - First observed
session_disconnect - First observed
session_get - First observed
session_list - First observed
session_logoff - First observed
session_send_message - First observed
session_stats - First observed
task_cancel - First observed
task_status
TDQS
Scored across 27 tools
Each tool maps to a unique resource+action; same-resource operations are clearly separated (session_get/list vs session_logoff/disconnect/send_message, machine_list/get vs reset/maintenance/remove). The aggregate read tools also have distinct outputs, so there is no real risk of picking the wrong tool for a task.
The set is mostly consistent and all snake_case, with resource-first names and predictable _get/_list suffixes. Some names break the pattern: machine_maintenance is not an imperative, and health_summary/session_stats/pool_utilization are noun phrases rather than action verbs.
27 tools is on the high side of the ideal range, but the VDI domain is broad and each tool covers a distinct operation or read view across sessions, machines, pools, entitlements, tasks, farms, and apps. There is little redundancy, so the count feels justified rather than bloated.
Core operational workflows are well covered: read/list for every resource, high-risk write actions with confirm gates, task status/cancel, entitlements, and health reporting. Gaps exist at the lifecycle level (no pool create/update/delete, no app-pool or farm management beyond listing), but these are not fatal for the apparent operational purpose.
Maintenance
Related MCP Connectors
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
- mttrlyOAuthcom.mttrly
AI-powered incident management and server monitoring via MCP.
AI governance MCP server for EU AI Act compliance and jurisdiction verification
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for VMware vSphere/vCenter operations, enabling natural language control of VMs, hosts, and infrastructure.Apache 2.0
- FlicenseNot gradedqualityCmaintenanceA comprehensive MCP server for VMware vSphere management, enabling AI agents to perform VM operations, monitoring, snapshots, and reporting through a secure, Dockerized environment.21-
- AlicenseAqualityCmaintenanceMCP server for Nutanix Prism Central v4 REST API, enabling AI agents to list and inspect VMs, control VM power state, list clusters, read alerts, and list subnets.8MIT
- AlicenseAqualityAmaintenanceMCP server for managing VMware vCenter (vSphere 7/8) with 39 tools covering VMs, clusters, and ESXi hosts. Supports direct and jump host deployment modes.20MIT