Open the Connect tab in the left sidebar to manage Clients (labelled Servers in some builds). The page name “Clients” refers to the configuration object, not the sidebar label.
Why Clients exist
Without Clients, every Chat or Eval would be tied to whatever ambient settings were active when you ran it. That makes results hard to reproduce and hard to share. Clients fix this by giving you:- Reproducibility — A snapshot of every setting that affects a run, so a teammate hitting the same Client gets the same conditions.
- Host emulation — Configure the inspector to look like Claude Desktop, ChatGPT, or your own host so you can verify your MCP server or MCP App degrades gracefully across them.
- Faster iteration — Switch between configurations with one click instead of editing fields in five places.
What you can configure
A Client groups settings into two layers: the protocol layer (how the MCP connection itself behaves) and the app layer (what an MCP App running inside the client is allowed to do).Protocol-level settings
These map directly to fields the inspector sends during the standard MCPinitialize handshake and on every subsequent request.
- Supported protocol versions — The ordered list of MCP protocol versions the client advertises. The first entry is sent as
protocolVersion; the rest form the accept-set. Useful for testing how your server handles older or newer clients. clientInfo— Thename,version, and any additional fields sent ininitialize.params.clientInfo. Set this to match a real host’s identifier when you want your server to take a host-specific code path.- Client capabilities — The capabilities object sent in
initialize(sampling, roots, elicitation, experimental, etc.). Enable or disable each one to test what your server does when a capability is missing. - Request timeout — Per-request timeout in milliseconds applied to all MCP calls (
tools/call,resources/read, etc.). Lower it to verify your server handles cancellation correctly; raise it for long-running tools. - Default headers — Headers attached to every HTTP-transport request. Useful for auth tokens, tenant IDs, or anything else your server expects upstream.
Per-server connection overrides
You can override the request timeout and headers per server from the project-wide server list. This lets a single project connect to one server with a long timeout and an auth header while keeping defaults for the others.Agent behavior
These settings control how the model interacts with tools during a chat session. They appear in the Agent tab of the Client focus panel.- Require tool approval — When on, the model pauses before each tool call so you can approve or deny it manually.
- Respect tool visibility — Controls whether the inspector honors the SEP-1865
_meta.ui.visibilityfield. When on (the default for all templates except Cursor), tools whose visibility is["app"]are hidden from the model’s tool list. When off, every tool flows to the model regardless of visibility, matching hosts that don’t yet implement visibility filtering (for example, real Cursor as of version 3.4.20). - Progressive tools — Three-state toggle (
On/Off/Auto). When on, the inspector injectssearch_mcp_toolsandload_mcp_toolsmeta-tools instead of sending the full tool catalog upfront, reducing context usage for large tool sets.Autolets the backend decide based on catalog size.
MCP App settings (SEP-1865)
When your server exposes MCP Apps — interactive UIs delivered viaui:// resources — the Client controls how the inspector renders and sandboxes them. These map to the fields a real host advertises in HostCapabilities and HostContext.
- Host capabilities — The set of
HostCapabilitieskeys the inspector advertises in theui/initializehandshake. Each host preset reflects that host’s published capability subset: for example, the Copilot preset advertises onlyopenLinks,serverTools,updateModelContext, andmessage— matching Microsoft 365 Copilot’s published Component-bridge table — and omitsserverResourcesandlogging. Use this to verify your app degrades gracefully when a capability it relies on is absent. - Sandbox CSP mode —
host-default,declared, orrelaxed. Controls the baseline Content Security Policy the inspector applies to your app’s iframe. - CSP restrictTo — Per-directive intersections (
connectDomains,resourceDomains,frameDomains,baseUriDomains) that further narrow what the app is allowed to fetch, embed, or set as a base URI. Restrict-only — the inspector never adds an undeclared domain. - Custom CSP directives — Verbatim source-expression overrides (e.g.
script-src: 'unsafe-eval' 'wasm-unsafe-eval') for cases where you need to model exactly what a particular host emits at the browser layer. - Permission Policy — Per-feature toggles for
camera,microphone,geolocation, andclipboard-write. Chooseresource-declared(grant what the app’s resource metadata asks for),deny-all, orcustom(your own allow map). - Display modes — Which of
inline,fullscreen, andpipthe inspector advertises inHostContext.availableDisplayModes. Test how your app responds when a requested mode isn’t available. - Theme and styles — The CSS variables and font block the inspector injects into
HostContext.stylesso you can verify your app picks up host theming. window.openaiinjection — Toggle whether the inspector injects the OpenAI Apps SDKwindow.openaishim into widget HTML before sandboxing. ChatGPT, Copilot, and MCPJam host presets enable this by default; Claude, Cursor, and Codex presets leave it off. You can override the preset per host using the toggle in the Apps Extension tab. The chip in the host capability matrix shows the current state and whether it comes from the preset or a manual override.
Apps Extension tab
The Apps Extension tab contains two independent capability matrices that never cross-gate — toggling a row in one has no effect on the other.window.openai matrix (ChatGPT compat shim) — Controls the window.openai.* surface advertised to apps using the ChatGPT compatibility shim. A master Inject window.openai toggle enables or disables injection entirely; a collapsed per-method disclosure lets you activate individual methods to build an exact subset from scratch. Switching on any single method turns injection on with only that method enabled; turning the last method off disables injection again.
app.* matrix (SEP-1865 spec bridge) — Controls the app.* surface advertised to apps using the primary MCP Apps protocol. A master MCP App support switch advertises the MCP UI client extension (io.modelcontextprotocol/ui). The matrix rows include:
availableDisplayModes— multi-checkbox cluster (inline,fullscreen,pip); unchecking the last mode force-enablesinline.widgetDisplayModeRequests— tri-state host policy (accept,user-initiated-only,decline) for widget-initiated display-mode requests.- Boolean dimensions — a flat list of all
app.*capability flags (e.g.toolInputPartial,toolCancelled,serverResources,logging,toolInfo,openLinks,serverTools,updateModelContext,message). Rows that diverge from the selected host preset are stored as sparse overrides.
Widget iframes are only rendered when the effective
clientCapabilities advertise
io.modelcontextprotocol/ui with a mimeTypes array that includes
text/html;profile=mcp-app. Custom capability configs with a bare
{ extensions: { "io.modelcontextprotocol/ui": {} } } entry (no mimeTypes
array) will not render widgets. SDK-default host shapes (Claude, ChatGPT,
Copilot, MCPJam) include the correct mimeTypes and are unaffected.All MCP App settings only take effect when the connected server actually
delivers a
ui:// resource. For plain tool-only servers, the protocol-level
settings are what matter.Creating a Client
- Open the Clients tab in the inspector.
- Click New Client.
- Give it a name (e.g.
Claude Desktop,ChatGPT,Strict CSP). - Open the focus panel to drill into protocol or MCP App settings.
- Click Save.
Server selection is project-wide, not per-client. Use the Auto-connect
toggle in the Servers tab header to enroll all project servers for
auto-connection. Per-server overrides (headers, timeout) are also configured
there.
Using a Client
Once saved, a Client shows up in the picker at the top of every consumer:- Chat — Drives the model, system prompt, attached servers, and connection settings for the conversation.
- Chatboxes — Same as Chat, but persisted as a saved chatbox configuration.
- Evals — Every test run inside an Eval uses the selected Client, so results are reproducible across teammates.
Server attachments
A server attachment is a named, reusable set of servers drawn from the project pool. Server attachments let you decouple which servers are active from the Client configuration itself, so you can swap the server set without touching the model or prompt settings.Eval suites
When you create an eval suite, you can pick a server attachment in the Servers section of the create dialog. All hosts attached to the suite run against that same server set. You can also change the attachment later from the suite header.- If no attachment is selected, the suite header shows an amber indicator. Runs will be rejected at start until an attachment is picked.
- Click the attachment pill in the suite header to open the picker and switch to a different attachment or create a new one inline.
- Open the server attachment picker (suite create dialog or suite header).
- Click Create new attachment… in the dropdown.
- Enter a name (e.g.
Production servers) and check the servers to include. - Click Create. The new attachment is selected immediately.
Chatboxes
The Servers section on the chatbox Publish tab shows which project servers the chatbox connects to. Click Edit servers to open the attachment editor and update the selection.- If no servers are picked, the chatbox displays an amber warning. Chat sessions started from that chatbox will have no tools until at least one server is selected.
- The server pick is sticky — editing the client’s model or system prompt does not change it.
Managing Clients
From the Clients index page:- Duplicate — Copy a Client when you want a small variant (e.g.
Claude Desktop — strict CSP) without rebuilding from scratch. - Delete — Removes the Client. The inspector blocks deletion if any chatbox or eval still depends on it; resolve those first, or use force delete if you’re sure.
Sharing across a project
Clients are scoped to the project, like servers and views. Every member of a shared project sees the same Client list and any saves sync automatically. This means a teammate can reproduce your exact test conditions by selecting the same Client from the picker — no copy-pasting settings.Comparing hosts
The Compare view lets you see how multiple host configurations stack up side by side — useful for spotting differences in capabilities, sandbox policies, or protocol settings before you ship to a specific host.Opening Compare
Compare is the third tab in the Connect section of the sidebar (Servers | Client | Compare). Click Compare from any Connect view to open it. The /host-compare route is preserved, so any existing bookmarks or links continue to work.
Deep-linking to a specific selection
Append?hosts=<id1>,<id2> to the /host-compare URL to pre-select a specific set of hosts on load:
?hosts parameter is omitted so shared links stay clean.
Compare from the Eval Playground
In the Eval Playground, the Hosts row next to + Attach host includes a Compare button. When two or more hosts are attached to the suite, clicking Compare opens the Compare view with exactly those hosts pre-selected. The button is disabled (with a tooltip) when fewer than two hosts are attached.Best practices
- Mirror your target hosts. Create one Client per real host you care about (
Claude Desktop,ChatGPT, your own product) and keep itsclientInfo, capabilities, and sandbox settings aligned with what that host actually advertises. - Test the negative paths. Build a “minimal” Client with most capabilities disabled and a strict CSP — running your server against it surfaces assumptions that won’t hold on more restrictive hosts.
- Pin Evals to a Client. Always select a Client before running an eval suite so the results are reproducible. Evals run against ambient settings drift the moment someone toggles something elsewhere.
- Duplicate before debugging. When you’re chasing a bug, duplicate the Client first and tweak the copy. Your baseline stays intact for comparison.
- Share Compare links. Toggle down to the hosts you care about and copy the URL — the
?hosts=parameter preserves your selection for teammates.

