surfacelab · observatory
az 000.0° · alt 00.0°
How to read the sky

An evaluation of MCP tool choice · 12 experiments run · 3 models

Which tool does the agent call?

We trained an instrument on 82 tools from real MCP servers and recorded where each decision landed. Every point in this sky is a real tool. Every beam is a recorded call.

Case file · rb09 · recordedgpt-oss-120b · Groq · temperature 0
“Click the Sign up button.”
First call: list_pages from Chrome DevTools, not browser_click from Playwright. In both orderings.
Why did it do that? Scroll.
scroll to open the dome

Before the data · how an agent picks a tool

An agent never sees your tools. It sees their descriptions, all at once.

1 · You ask“Click the Sign up button.”
2 · The model reads every tool you installed browser_click: Perform click on a web page
list_pages: Get a list of pages open in the browser.
browser_snapshot: Capture accessibility snapshot…
… 28 more, from two servers
3 · It calls onewhich one?
A wrong call doesn't crash.The agent just does something else. Nothing in the logs says it chose badly.
We change one thing at a time.Tool order, the wording, extra tools, a second server. Then we record where the call lands.
Every claim has its interval.Preregistered, counted over families of cases, with nulls published next to effects.

I · The request

Before it reads your message, the model reads every tool you installed.

Running example:browser_clickandlist_pagessit in this list. Switch to Browser to find them.
1,500

II · What didn't matter

When each tool has one clear job, almost nothing moves the choice.

Six interventions, each preregistered. A dot is the estimate, the bar its 95% interval, counted over families of cases. Each tile has its own scale.

What does “95% interval, clustered over families” mean?

A family is one request and all its variants (orderings, wordings). Variants of one request are not independent: if the model is confused by a request, it tends to be confused in every ordering. So we resample whole families, recompute the number thousands of times, and report the middle 95% of those results. Chapter VIII lets you watch it happen.

These surfaces were written by us, with one distinct job per tool. Chapter IV asks what happens on real servers.

III · Ties

When four tools do the same job, position breaks the tie.

The rack: four near-synonym tools, re-ordered through all 24 recorded orderings. Each beam is one of 8 requests' recorded calls. The strip under the rack fills in how often the right tool was picked, by the slot it sat in.

1 / 24

+0 pp
Gap+10.4 pp · gpt-oss-120b
95% CI[+2.1, +19.8] · 8 families · 192 trials
Labelexploratoryreplicated
Sourceresults/exp001_siblings_t0_analysis.json · exp014_analysis.json

These four tools are synonyms, so "right" is the keyword gold of each request; this measures tie-breaking, not an error rate.

IV · Real servers

On real servers, misses land on look-alikes.

Running example:is one of these threads.

Threads join a wrong call to the right tool; brighter means more trials made that mistake. Most join near neighbours: tools whose descriptions read alike.

95%
Right tool77% gpt-oss-120b
95% CI[63, 88] · 20b 78 [66, 88] · qwen 91 [82, 98]
Ours99%+ on hand-written surfaces (EXP-009)
Look-alikewrong pick at the 71st similarity percentile · p = 0.0007
Labelbelow 0.90 targetsimilarity: exploratory
Sourceresults/exp013_analysis.json · exp013_h4.json

48 families, three open models, one provider, first call only.

V · Who gets the call

When servers overlap, the model's first move follows habit.

Two waves of beams: the same 12 requests, once per ordering of the servers. The bars count where every first call landed, by server.

Wavescroll here to fire
Labelexploratory
Sourceresults/exp013_120b.json

Counts of recorded first calls. A multi-step agent might still finish the job; this measures the first action, not the outcome.

VI · The lab

Point the instrument yourself.

Pick a model, a set of servers and a request. The beam is the recorded first call. Switch which server is listed first to compare orderings. Drag the open sky to orbit.

VII · The plate archive

Every experiment, including the ones that found nothing.

Fourteen preregistered experiments. Each plate has its question, sample, verdict, key number, source file and what it taught us. Nulls and experiments we chose not to run are kept beside the effects.

VIII · How sure we are

Where the intervals come from, and why one run is never enough.

The bootstrap, live simulated · resampling recorded families in your browser

The synonym test has 8 request families. We draw 8 families with replacement, recompute the first − last third gap, and repeat. The spread of those gaps is the interval. Repeated trials of one family are never counted as independent.

Seeing conditions

Astronomers call a steady sky good seeing. We asked the same question 5 times at temperature 0. Each row is one request and ordering; each dot one answer, coloured by tool.

Unstable
Sourceresults/determinism_probe.json

Why we fix temperature, record every answer and count over families.

IX · Your server

Point the instrument at your own tools.

Drop a tools/list JSON (or a surfacelab snapshot). Your tools join the sky, placed by how alike their descriptions read, with the token cost and the pairs most likely to be confused. The file never leaves your browser.

Pairs that read most alike

Load a file to see them.

Similarity here is lexical (TF-IDF over description words), computed in your browser; the sky above uses an embedding model. To measure real confusion, run the CLI below on your server.

uv run surfacelab probe --server-name mine --snapshots-dir runs/mine -- <your server command> uv run surfacelab inspect <surface>

X · Test this page · EXP-008

Does the 3D sky actually help? Help us measure it.

Two short tasks, about a minute. In one you use the sky, in the other a plain table; which comes first is decided for you. We record whether you answered right and how long it took. Nothing else is stored, and the result is published whatever it shows.

Preregistered in docs/experiments/EXP-008.md. Exploratory: a small sample of peers, not generalisable. Answers are stored per person; only the page owner can read them.

Coda · What it means

Tools fail where their descriptions blur together.

1Make each tool's description say what makes it different. With one clear job per tool, order, wording and extra tools barely mattered; on real servers, misses landed on look-alikes. Chapter II · IV
2Test the servers your users install together. Hand-written surfaces scored 99%+; real loadouts dropped gpt-oss to 77–78% when only one tool could do the job. Chapter IV
3Check what the agent does first. A second server changed the first move, and which server handles a shared job is a model habit. Chapter V
→Run the checks on your own tool list in chapter IX, or with the CLI below.
Order effect20b +2.7 pp [−10.8, +15.8] · 120b +0.0 [−7.1, +7.9] · qwen +7.3 [−3.3, +17.4]
Labelinconclusive
Sourceresults/exp013_analysis.json · docs/FINDINGS.md

Run it yourself

# see where a loadout's tokens go uv run surfacelab inspect real_browser # re-derive this page's EXP-013 numbers offline, no API key PYTHONPATH=scripts uv run python scripts/analyze_followups.py --exp 13 # handshake-probe your own server and snapshot its tool list uv run surfacelab probe --server-name mine --snapshots-dir runs/mine -- <your server command>

Source, data and methods on GitHub. Every number on this page traces to a file in results/ (see docs/FINDINGS.md). Star positions are a 3D projection (pca) of description embeddings (text-embedding-3-small): similarity, not confusion. The sky, horizon and dome are scenery and carry no data.