Adopt without redeploying
Give clients one front door
Keep remote credentials private
Make remote traffic visible
When to use an external server
Choose an external server when the runtime should stay outside Horizon, but MCP access should be managed through Horizon.| Situation | Why external helps |
|---|---|
| The MCP server is already deployed and operated by another team | Horizon can protect and expose the server without changing its ownership model. |
| The server must stay in a specific network or runtime environment | Horizon forwards accepted requests while you keep the remote deployment where it is. |
| You want to standardize client access before migrating runtime | Clients can move to a Horizon endpoint first; runtime migration can be a separate decision. |
| A sensitive remote server should not be connected to every client directly | Clients authenticate to Horizon, and Horizon uses the configured remote credentials when it forwards requests. |
| A remote server should become a backend for a remix server | Register it once, then include selected capabilities in a curated remix endpoint. |
User-visible contract
To clients, an external server behaves like a Horizon MCP server. The client connects to the Horizon endpoint, authenticates to Horizon when required, and discovers the capabilities that Horizon has learned from the remote server. Horizon does not change the remote server’s tool behavior. It governs the path to the server, records gateway activity, and forwards accepted MCP requests to the remote endpoint you configured.| Concern | Contract |
|---|---|
| Client endpoint | Clients use the Horizon-served MCP URL, not the remote server URL. |
| Capabilities | Horizon discovers tools, resources, and prompts from the remote server. |
| Access | Horizon checks server and capability access before forwarding client traffic. |
| Remote authentication | Horizon uses the configured remote credentials when it calls the remote endpoint. |
| Runtime behavior | The remote server still executes the request and owns its application behavior. |
| Observability | Horizon records gateway-level requests and sessions; remote runtime logs remain outside Horizon. |
Ownership boundary
External servers intentionally split platform responsibility from remote runtime responsibility.| Concern | Horizon manages | You manage |
|---|---|---|
| Client access | Horizon endpoint, authentication, authorization, capability policies, and client-facing request logs. | Which users and service accounts should receive access. |
| Remote runtime | Forwarding accepted requests to the configured endpoint. | Deployment, uptime, scaling, dependencies, and application logs for the remote server. |
| Remote credentials | Secure storage and use of the configured remote credential. | Credential issuance, rotation timing, and remote-server policy. |
| Metadata snapshot | Discovery, display, and policy attachment for remote capabilities. | Keeping the remote capability lists valid, stable, and descriptive. |
| Failures | Gateway status, forwarding outcomes, request metadata, and session metadata. | Remote server errors, remote availability, and incorrect application responses. |
Request flow
Client calls the Horizon endpoint
Horizon checks access
Horizon forwards to the remote server
The remote server handles the MCP call
Authentication model
External servers have two authentication layers. Keep these layers separate when you debug a connection: a client can be signed in to Horizon and still be missing the credential Horizon needs for the remote server.| Layer | What the user experiences | What Horizon does |
|---|---|---|
| Client to Horizon | The MCP client signs in to Horizon or sends a Horizon API key for the Horizon endpoint. | Horizon authenticates the caller and applies server access and capability policy. |
| Horizon to remote server | The user authorizes the remote server with OAuth or stores a remote API token in Horizon, or an admin configures one shared token for the connector. | Horizon forwards accepted MCP requests to the remote server with the stored remote credential, scoped to the user or shared across the organization. |
OAuth user experience
OAuth-backed external servers use a popup-based handoff so the user can grant Horizon access to the remote server without giving the MCP client the remote credential.Configure OAuth
Start authorization
Authorize with OAuth. Horizon opens a popup and
the setup page shows a waiting state while the user finishes authorization
in the popup.Grant remote access
Return to Horizon
Authorization Complete, and the original setup or client
authorization continues.Token user experience
Token-backed external servers do not open an OAuth popup. They come in two shapes:- Per-user API key: each user enters their own remote token in Horizon, and Horizon uses that token only for that user’s requests.
- Shared API key: an admin configures one token when registering the connector, and Horizon uses it for everyone in the organization.
Auth failure behavior
| Event | What the user sees | What to fix |
|---|---|---|
| The MCP client is not signed in to Horizon | Horizon rejects the client request or starts the Horizon client authorization flow. | Sign in to Horizon or update the Horizon API key used by the client. |
| The user closes or denies the OAuth popup | The setup or client authorization page keeps waiting for remote authorization. | Start the OAuth flow again and approve the requested scopes. |
| The browser blocks the popup | Horizon shows that it could not open the OAuth popup, or the page remains in a waiting state. | Allow popups for Horizon and retry Authorize with OAuth. |
| The OAuth link expires or the callback fails | The popup shows an authorization failure instead of completing. | Close the popup and restart the OAuth flow from Horizon. |
| The stored remote credential is missing, expired, revoked, or invalid | Horizon can authenticate the client, but calls to the remote server fail authorization. | Reauthorize with OAuth or update the stored token. |
| Horizon policy denies the caller | The capability is hidden or blocked before the remote server is called. | Update Horizon server access or capability policy; remote authorization will not fix this. |
Register an external server
Enter the remote MCP URL
Configure remote authentication
Inspect capabilities
How discovery works
When you register or refresh an external server, Horizon captures a snapshot of the remote server’s MCP metadata. Horizon initializes an MCP session with the remote endpoint, then asks for tools, prompts, and resources. Those list requests run independently, so one failed list method does not automatically discard metadata returned by the others. Horizon stores that snapshot with the external server metadata. The snapshot is used for the dashboard, client setup surfaces, remix composition, and capability policy setup. If initialization fails, metadata capture fails. If every list response is empty or unavailable, metadata capture fails because Horizon cannot tell whether the server has no useful capabilities or discovery did not work. If at least one list response succeeds, Horizon can store the metadata it received and leave the missing capability types empty. Runtime traffic still goes to the remote server. When a client callstools/list, prompts/list, or resources/list through the Horizon endpoint,
Horizon asks the remote server for the current list and applies access filtering
before returning the response. Inspector, ChatMCP, and external clients still
depend on the runtime endpoint being able to reach the remote server.
tools/list response before the dashboard snapshot has been
refreshed. If capability policy is configured, refresh the external server
metadata and update policy before expecting the new tool to appear.Metadata and policy lifecycle
Treat remote metadata changes as compatibility changes. If the remote server adds, removes, renames, or changes a capability schema, refresh discovery and review policies before relying on the new shape in production clients.| Remote change | Horizon impact | Recommended action |
|---|---|---|
| Add a capability | Runtime lists may show it before the dashboard snapshot or policy setup includes it. | Refresh metadata, inspect the capability, and update policy if it should be governed. |
| Remove a capability | Clients or remixes that depend on it may fail or stop showing it. | Update clients, remixes, and policies before removing it from production use. |
| Rename a capability | Horizon treats the old and new names as different capabilities. | Update policies and client instructions that reference the old name. |
| Change input schema | Existing client calls may become invalid. | Test the updated schema in Inspector before updating clients. |
| Change remote authentication | Horizon may fail to forward requests once the old credential stops working. | Update the stored remote credential before rotating the old one out. |
List and call failure behavior
An external server has one remote backend, so list behavior depends on that backend’s response.| Event | What clients see through Horizon |
|---|---|
| The remote server does not support a list method | Horizon returns an empty list for that capability type. |
| The remote server is unavailable during a list request | Horizon can return an empty list for that capability type. |
| The remote server returns an authentication, authorization, or protocol error | The list request can fail instead of being treated as an empty list. |
| A caller is denied by Horizon capability policy | The capability is hidden from list responses and blocked when called directly. |
| The remote server fails while handling a selected call | Horizon returns the remote failure to the client and records gateway request metadata. |
Before clients use the server
An external server is ready for client use when Horizon can discover it, authenticate to it, and enforce the access boundary you expect. Check the server from Horizon before updating client configuration:- Discovery shows the tools, resources, and prompts clients should see.
- Inspector can call representative capabilities through the Horizon endpoint.
- A caller without access receives a gateway denial instead of reaching the remote server.
- Request logs show forwarded calls with the expected client and user metadata.
- The team that owns the remote server can debug runtime errors outside Horizon.
Troubleshooting
Start with where the request stopped. Horizon request logs show whether the gateway denied, forwarded, or received an error from the remote server. If forwarding succeeded, debug the remote runtime.Horizon cannot discover capabilities
Horizon cannot discover capabilities
Clients receive 401
Clients receive 401
Clients receive 403
Clients receive 403
The OAuth popup never completes
The OAuth popup never completes
Authorize with OAuth. If
the popup opens but returns an error, restart the OAuth flow so Horizon can
create a fresh authorization request.Horizon sign-in works but the remote server returns unauthorized
Horizon sign-in works but the remote server returns unauthorized
Clients receive errors from the remote server
Clients receive errors from the remote server
Inspector shows stale tools
Inspector shows stale tools
Horizon request logs succeed but the user sees bad data
Horizon request logs succeed but the user sees bad data