Horizon MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | Host interface to bind when using HTTP transport. | 0.0.0.0 |
| MCP_PORT | No | Port for HTTP transport when MCP_TRANSPORT is not stdio. | 8000 |
| MCP_API_KEY | No | Optional API key for authenticating MCP clients when using HTTP transport. If set, clients must send it as a Bearer token. Ignored for stdio. | |
| MCP_TRANSPORT | No | Transport protocol for the MCP server: 'stdio' (default), 'streamable-http', or 'sse'. | stdio |
| HORIZON_BASE_URL | Yes | The URL of the Omnissa Horizon Connection Server, e.g. https://horizon.corp.example.com | |
| HORIZON_VERIFY_SSL | No | Set to 'false' to disable TLS certificate verification (not recommended for production). Defaults to true. | true |
| HORIZON_ACCESS_TOKEN | No | Access token for Horizon API. Can be provided here or obtained at runtime via the horizon_login tool. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| horizon_loginA | Authenticate to Horizon and activate the session for this server. The tokens are kept server-side: subsequent tool calls work immediately, and when the access token expires (~8 hours) the server renews it automatically with the refresh token. Only short token hints are returned. |
| horizon_refresh_tokenA | Exchange the refresh token for a new access token. Rarely needed: the server already refreshes an expired access token automatically. |
| horizon_logoutB | Invalidate the current Horizon session (access + refresh tokens). |
| list_connection_serversB | List all Horizon Connection Servers in the pod. |
| get_connection_serverC | Get configuration details for a specific Connection Server. |
| list_virtual_centersA | List all vCenter Servers configured in the Horizon environment. |
| get_environment_propertiesA | Get environment-level properties including version, FIPS mode, and feature flags. |
| get_settingsA | Get the global Horizon configuration settings. Includes client session timeouts, pre-launch settings, display protocol defaults, HTML Access settings, and other global options. |
| get_global_policiesA | Get global VDI policies including USB redirection, multimedia redirection, clipboard settings, and other environment-wide policy settings. |
| update_global_policiesA | Update global VDI policies (USB redirection, clipboard, multimedia redirection). Always call get_global_policies first to read current values. Only modify the specific fields you intend to change — pass the full object back. |
| update_settingsA | Update a Horizon settings section. setting_type maps to these resources and endpoints: general → horizon://config/settings/general security → horizon://config/settings/security client → horizon://config/settings/client feature → horizon://config/settings/feature agent-restriction → horizon://config/settings/agent-restriction Always read the current settings first and only modify the fields you intend to change. general: Horizon returns restricted_client_data entries that have only a "type", but rejects them on update with "Restricted client version must be set for client type " (verified on 2606), so passing the settings back unchanged fails. Give every restricted_client_data entry a "version" before calling this. |
| list_licensesA | List all Horizon licenses and their status, mode, and expiry information. |
| get_event_databaseA | Get the configuration and connection status of the Horizon event database. |
| list_ic_domain_accountsA | List instant clone domain accounts used for provisioning instant clone desktops. |
| list_image_managementA | List image management streams, versions, or tags. Versions and tags belong to a stream, so Horizon requires a stream ID for them (verified live — omitting it returns 400 "im_stream_id parameter is missing"). List streams first, then pass a stream's id as stream_id. |
| list_gatewaysA | List all registered Unified Access Gateways. |
| trigger_connection_server_backupA | Initiate an immediate backup of one or more Connection Servers. CAUTION: This triggers an active backup operation, not a validation check. If no server_ids are provided, all Connection Servers are backed up. |
| get_api_coverageA | List all available Horizon MCP tools, resources, and unsupported operations. Call this to understand what can be managed via this MCP server before attempting a task, or to accurately inform users which Horizon features are and are not supported. Returns three sections: tools — all callable tools grouped by function resources — read-only MCP Resources (horizon://) for config and monitor data not_yet_supported — Horizon API operations not yet implemented |
| list_pool_entitlementsA | List entitlements for all pools of the given type. Returns which users and groups are entitled to each pool. Use get_pool_entitlement for a specific pool's details. |
| get_pool_entitlementB | Get the users and groups entitled to access a specific pool. |
| set_pool_entitlementsA | Add, replace, or remove entitlements for a desktop or application pool. CAUTION: action='replace' removes any existing entitlements not in the provided list. CAUTION: action='remove' immediately revokes access for the specified principals. Always confirm with the user before using replace or remove. NOTE: action='replace' is only supported for desktop pools — the Horizon API has no bulk-replace endpoint for application pools. |
| search_ad_users_or_groupsA | Search for AD users and groups in the Horizon environment. Use the returned 'id' field when setting pool entitlements. Common filter fields: name, login_name, group, domain. Example filters: Find user by login: {"type":"Equals","name":"login_name","value":"jsmith"} Find by display name: {"type":"Contains","name":"name","value":"John"} Groups only: {"type":"Equals","name":"group","value":"true"} Returns {items, count, page, size, pages_fetched, has_more, next_page, truncated}. If has_more is true there may be more results: call again with page=next_page (or narrow the filter), or pass fetch_all=true to fetch pages automatically (stops after 10 pages or 5000 items and sets truncated=true). Never treat a result with has_more=true as the complete list. |
| get_ad_user_or_groupB | Get detailed information about a specific AD user or group. |
| list_ad_domainsA | List all Active Directory domains configured in the Horizon environment. Returns domain details including trust relationships, status, and bind accounts. |
| list_ad_containersA | List AD containers (OUs) available in a domain for pool provisioning. The rdn (relative distinguished name) from these results is used as ad_container_rdn in create_desktop_pool's customization_settings (or create_rdsh_farm's automated_farm_settings.customization_settings) to control which OU newly provisioned computers are placed in — NOT provisioning_settings. This is the OU picker equivalent of what the Horizon Console shows during pool creation. |
| get_domain_netbios_mapA | Get a mapping of domain NETBIOS names to DNS names for all configured domains. |
| list_audit_eventsA | List Horizon audit events (administrative actions and system events). Useful for reviewing recent changes, troubleshooting, and compliance auditing. Returns {items, count, page, size, pages_fetched, has_more, next_page, truncated}. If has_more is true there may be more results: call again with page=next_page (or narrow the filter), or pass fetch_all=true to fetch pages automatically (stops after 10 pages or 5000 items and sets truncated=true). Never treat a result with has_more=true as the complete list. |
| list_base_vmsA | List VMs in vCenter that can be used as base images for instant clone pools/farms. |
| list_datastoresA | List datastores available in vCenter for desktop pool or farm provisioning. |
| list_vm_foldersA | List VM folders in a vCenter datacenter for use in pool/farm configuration. |
| list_datacentersA | List datacenters in a vCenter Server. The datacenter ID is required by list_vm_folders, list_hosts_or_clusters, and create_desktop_pool / create_rdsh_farm provisioning_settings. |
| list_hosts_or_clustersA | List hosts and clusters in a vCenter datacenter. The host_or_cluster_id is required by list_datastores, list_resource_pools, list_network_labels, and create_desktop_pool / create_rdsh_farm provisioning_settings. |
| list_resource_poolsA | List resource pools on a host or cluster. The resource_pool_id is required by create_desktop_pool and create_rdsh_farm provisioning_settings. |
| list_base_vm_snapshotsA | List snapshots of a base VM that can be used as the image for an instant clone pool or farm. The result's id is used as base_snapshot_id in create_desktop_pool's or create_rdsh_farm's provisioning_settings when source is INSTANT_CLONE. CAUTION: don't just pick the first or most recent result. The chosen snapshot must have been taken AFTER the Horizon Agent (with Instant Clone support) was installed and configured on the VM — a snapshot from before that point will provision machines that fail customization (observed live: Horizon reports "AGENT_CUSTOMIZATION_FAULT ... IC Agent missing"). If multiple snapshots exist, check their names/descriptions for one indicating the agent is installed (e.g. containing "agent") rather than an earlier generic checkpoint (e.g. "clean"). When in doubt, ask the user which snapshot to use. |
| list_network_labelsA | List network labels (port groups / distributed port groups) available on a host or cluster. Network label IDs are used in the nics array of create_desktop_pool and create_rdsh_farm provisioning_settings: "nics": [{"nic_id": "", "network_label_id": ""}] |
| list_network_interface_cardsA | List the network interface cards (NICs) on a base VM or VM template. Horizon requires either base_vm_id (instant-clone pools/farms, optionally with base_snapshot_id) or vm_template_id (full-clone pools) — verified live, omitting both returns 400. Each result's id is the network_interface_card_id in the top-level nics array of create_desktop_pool / create_rdsh_farm: "nics": [{"network_interface_card_id": "", "network_label_assignment_specs": [...]}] |
| list_vm_templatesA | List VM templates available in vCenter for use as pool base images. Templates are used for full-clone or linked-clone desktop pools (source=FULL_CLONE or LINKED_CLONE). Use the template_id in create_desktop_pool provisioning_settings instead of parent_vm_id. |
| list_datastore_clustersA | List datastore clusters (Storage DRS pods) available on a host or cluster. Use the datastore_cluster_id in create_desktop_pool or create_rdsh_farm provisioning_settings when using Storage DRS for automated datastore placement. |
| list_customization_specificationsA | List vCenter customization specifications (Sysprep/QuickPrep) available for pool provisioning. The customization_specification_id from these results is used in create_desktop_pool and create_rdsh_farm provisioning_settings to apply OS customization (hostname, domain join, license key) to provisioned VMs. |
| diagnose_sessionA | Retrieve diagnostic information for a user session in a single call. Fetches any combination of: logon timing breakdown, real-time display protocol metrics, 15-minute historical performance, running processes, and active remote applications. Results are keyed by aspect name; a failed aspect returns {"error": ""} rather than failing the whole call. The help desk endpoints take the session's internal_session_id, not its id (verified live: passing the id returns "Session with requested id was not found"), so this looks the session up first to get it. |
| get_remote_assistance_ticketA | Generate a Microsoft Remote Assistance ticket for a user session. Returns an MSRA connection ticket that allows a help desk technician to view and control the user's desktop session. |
| end_remote_applicationA | Terminate a specific remote application running in a session. CAUTION: The application will be force-closed. Unsaved data will be lost. Confirm with the user before calling this. |
| list_desktop_poolsA | List all desktop pools (VDI and RDS) in the Horizon environment. Returns {items, count, page, size, pages_fetched, has_more, next_page, truncated}. If has_more is true there may be more results: call again with page=next_page (or narrow the filter), or pass fetch_all=true to fetch pages automatically (stops after 10 pages or 5000 items and sets truncated=true). Never treat a result with has_more=true as the complete list. |
| get_desktop_poolA | Get detailed configuration and status of a specific desktop pool. Uses the v13 endpoint (not v1) specifically so this response contains every field update_desktop_pool's schema can require — verified live, zero gap. Earlier versions of this tool used v1, whose response is missing most of those fields, making a real get-then-update round trip impossible without guessing at values Horizon never returns. |
| create_desktop_poolA | Create a new desktop pool. CAUTION: Provisioning an AUTOMATED pool immediately begins creating VMs in vCenter. Always confirm with the user before calling this. |
| update_desktop_poolA | Update an existing desktop pool's configuration. |
| delete_desktop_poolA | Delete a desktop pool and all of its machines. CAUTION: This is irreversible. All machines in the pool are deleted and any active user sessions are terminated. Always confirm with the user before calling this. |
| desktop_pool_actionA | Enable, disable, or toggle provisioning for one or more desktop pools. enable/disable controls whether new user sessions can be established. enable-provisioning/disable-provisioning controls whether new VMs are provisioned. Disabling provisioning is the correct way to pause scale-out during maintenance. |
| list_machinesA | List machines (virtual desktops) in the environment. To filter by pool, use: filter={"type":"Equals","name":"desktop_pool_id","value":""} To filter by state, use: filter={"type":"Equals","name":"state","value":"AVAILABLE"} Returns {items, count, page, size, pages_fetched, has_more, next_page, truncated}. If has_more is true there may be more results: call again with page=next_page (or narrow the filter), or pass fetch_all=true to fetch pages automatically (stops after 10 pages or 5000 items and sets truncated=true). Never treat a result with has_more=true as the complete list. |
| get_machineC | Get detailed information about a specific machine. |
| machine_actionA | Perform a bulk action on one or more machines. Actions:
CAUTION: rebuild and reset are destructive and will discard unsaved user data. Always confirm with the user before calling these actions. |
| assign_machine_usersA | Assign or unassign users to a dedicated desktop machine. Only applicable to machines in dedicated (non-floating) desktop pools. A machine can only have one assigned user at a time in most pool configurations. |
| list_rdsh_farmsA | List all RDS (Remote Desktop Session Host) farms in the environment. Returns {items, count, page, size, pages_fetched, has_more, next_page, truncated}. If has_more is true there may be more results: call again with page=next_page (or narrow the filter), or pass fetch_all=true to fetch pages automatically (stops after 10 pages or 5000 items and sets truncated=true). Never treat a result with has_more=true as the complete list. |
| get_rdsh_farmB | Get detailed information about a specific RDS farm. Uses the v10 endpoint (not v1) so this response contains every field update_rdsh_farm's schema can require — verified live, zero gap (mirrors the same fix applied to get_desktop_pool). |
| create_rdsh_farmA | Create a new RDS farm. CAUTION: Provisioning an AUTOMATED farm immediately begins creating VMs in vCenter. Always confirm with the user before calling this. |
| update_rdsh_farmC | Update an existing RDS farm's configuration. |
| delete_rdsh_farmA | Delete an RDS farm and all of its servers. CAUTION: This is irreversible. All servers in the farm are deleted and any active user sessions are terminated. Always confirm with the user before calling this. |
| rdsh_farm_actionA | Enable or disable one or more RDS farms. Disabling a farm prevents new sessions from being routed to it without terminating existing sessions — useful for draining a farm before maintenance. Unlike desktop pools, farms have no bulk enable/disable endpoint, and Horizon's farm update schema requires several fields beyond "enabled" (verified live — a naive partial-body PUT gets rejected). So this fetches each farm's full current state first, changes only "enabled", and PUTs the complete spec back — a real get-then- update round trip, not a guess. Reports per-farm results if any still fail. |
| list_application_poolsA | List published application pools in the environment. Returns {items, count, page, size, pages_fetched, has_more, next_page, truncated}. If has_more is true there may be more results: call again with page=next_page (or narrow the filter), or pass fetch_all=true to fetch pages automatically (stops after 10 pages or 5000 items and sets truncated=true). Never treat a result with has_more=true as the complete list. |
| get_application_poolB | Get detailed information about a specific application pool. |
| create_application_poolC | Publish a new application pool from an RDS farm. |
| update_application_poolA | Update an existing application pool's configuration. Horizon returns supported_file_types_data with both its auto-discovered file_types and enable_auto_update_file_types=true, then rejects that combination on update ("file_types cannot be set when enable_auto_update_file_types is enabled", verified on 2606). So when auto-update is on, file_types is dropped here: Horizon manages that list itself. |
| delete_application_poolA | Delete a published application pool. CAUTION: Users will immediately lose access to this application. Always confirm with the user before calling this. |
| list_sessionsA | List active user sessions in the environment. Common filter fields: user_name, desktop_pool_id, machine_name, client_name, state. Session states: CONNECTED, DISCONNECTED, PENDING. Returns {items, count, page, size, pages_fetched, has_more, next_page, truncated}. If has_more is true there may be more results: call again with page=next_page (or narrow the filter), or pass fetch_all=true to fetch pages automatically (stops after 10 pages or 5000 items and sets truncated=true). Never treat a result with has_more=true as the complete list. |
| get_sessionB | Get detailed information about a specific user session. |
| disconnect_sessionsA | Disconnect one or more user sessions (sessions remain active, clients are disconnected). The user's applications keep running. Use logoff_sessions to fully terminate sessions. |
| logoff_sessionsA | Log off one or more user sessions, terminating their running applications. CAUTION: This will close all running applications in the session. Unsaved data will be lost. Always confirm with the user before calling this. |
| reset_or_restart_sessionsA | Reset or restart the virtual machine backing one or more sessions. CAUTION: Both actions will terminate the user's session. reset is a hard power-cycle and may cause data loss. restart attempts a graceful reboot but the session will still end. Always confirm with the user before calling this. |
| send_message_to_sessionsA | Send a pop-up notification message to one or more active user sessions. |
| get_infrastructure_healthA | Get health and status across Horizon infrastructure in a single call. Components:
Results are keyed by component name. A failed component returns its error as a string rather than failing the whole call. |
| get_connection_server_healthB | Get detailed health information for a specific Connection Server. |
| get_metricsA | Get performance and capacity metrics across the Horizon environment in a single call. Scopes:
Results are keyed by scope name. A failed scope returns its error as a string rather than failing the whole call. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| config_roles | RBAC roles defined in Horizon (name, id, privileges). |
| config_permissions | Permission assignments mapping roles to access groups and principals. |
| config_privileges | All selectable Horizon admin privileges. |
| config_local_access_groups | Local access groups used for role-based admin delegation. |
| config_federation_access_groups | Federation access groups (Cloud Pod Architecture). |
| config_gateway_access | Users and groups with gateway access. |
| config_users_groups_global_summary | Global summary of admin users and groups across pods. |
| config_saml_authenticators | SAML 2.0 authenticators configured in Horizon. |
| config_radius_authenticators | RADIUS authenticators configured in Horizon. |
| config_gssapi_authenticators | GSSAPI/Kerberos authenticators configured in Horizon. |
| config_jwt_authenticators | JWT authenticators configured in Horizon. |
| config_unauthenticated_access_users | Users configured for unauthenticated (kiosk) access. |
| config_app_volumes_managers | App Volumes Managers registered with Horizon (id, URL, status). |
| config_uem_servers | User Environment Manager servers registered with Horizon. |
| config_true_sso | TrueSSO connector configurations. |
| config_true_sso_enrollment_servers | TrueSSO enrollment servers. |
| config_compute_profiles | Compute profiles available for pool and farm provisioning. |
| config_customization_specifications | vCenter customization specifications (Sysprep/QuickPrep) defined in config. |
| config_external_deployments | External deployments (e.g. Horizon Cloud links) registered with this pod. |
| config_secondary_credentials | Secondary credentials configured for connection servers. |
| config_message_clients | Message security mode clients registered with Horizon. |
| config_rcx_servers | RCX (Remote Console) servers registered with Horizon. |
| config_settings_agent_restriction | Agent restriction settings (allowed client versions and types). |
| config_settings_client | Client feature and behaviour settings. |
| config_settings_feature | Feature toggle settings. |
| config_settings_general | General Horizon settings. |
| config_settings_security | Security-related Horizon settings. |
| config_pre_logon_settings | Pre-logon message and warning banner settings. |
| config_syslog | Syslog server configuration. |
| config_ceip | Customer Experience Improvement Program (CEIP) enrollment status. |
| config_url_redirection | URL content redirection rules. |
| config_log_levels | Current log level settings for Horizon components. |
| config_log_collector_tasks | Log collection tasks (in-progress and completed bundles). |
| monitor_app_volumes_managers | App Volumes Manager health and connectivity status. |
| monitor_event_database | Event database connection status and metrics. |
| monitor_rds_servers | Health and session load for all RDS servers across all farms. |
| monitor_saml_authenticators | SAML authenticator health and certificate status. |
| monitor_true_sso | TrueSSO connector health and certificate status. |
| monitor_datastore_usage | Datastore space usage metrics broken down by pool and farm. |
| monitor_pods | Remote pod health in Cloud Pod Architecture (CPA) federation. |
| monitor_global_session_metrics | Aggregate session counts across all pods in CPA federation. |
| monitor_message_clients | Message security client health status. |
TDQS
Scored across 72 tools
Tools are largely separated by resource and action (create/get/update/delete_desktop_pool, list_sessions/get_session, etc.), and the *_action tools are clearly documented as bulk lifecycle toggles. There is mild overlap in the settings surface (get_settings vs get_global_policies vs get_environment_properties, and their update counterparts), but descriptions clarify boundaries.
Names follow a predictable snake_case verb_noun convention (list_, get_, create_, update_, delete_) almost throughout, including consistent horizon_* auth tools. Minor deviations are the noun_action tools (machine_action, desktop_pool_action, rdsh_farm_action) and slightly irregular list_hosts_or_clusters, but these are still readable and systematic.
At 72 tools this is a very heavy surface, well beyond the 3-15 sweet spot, and an agent must sift through many near-sibling calls. The domain (pools, farms, machines, sessions, entitlements, AD, vCenter inventory, settings, monitoring) is genuinely broad so most tools earn their place, but the sheer count risks selection errors.
Core lifecycles are well covered: full CRUD for desktop pools, RDS farms, and application pools, plus machine/session actions, entitlements, AD search, vCenter inventory helpers, and health/metrics rollups. Gaps are mostly read-only areas (e.g. connection servers, licenses, gateways lack update/management ops), which an agent can work around.