GlossaryFloor 2 · The Harnessthe block and its bolted-on plates: what gets added to itFloor 2 · The Harness
MCP
No. 039 · v2026-08FR: MCPMCP is a standard socket between the software that drives a model and the tools or documents it has to reach. Like a standardised electrical socket: every appliance plugs in without a bespoke cable, and changing one does not mean redoing the wiring.
What it is not
MCP is not a capability of the model. A model does not know this protocol, does not connect to it and is unaware that it exists: it is the harness that speaks this language, fetches what is needed, then gives it to the model to read like any other text. Nor is it extra intelligence or a product to buy: it is a plug-in convention, plumbing. Connecting a source this way therefore does not make a system more competent, it gives it access to more things.
In depth
The multiplication problem
The problem this protocol solves is a problem of multiplication. Without a common convention, every product that drives a model has to write a bespoke connection to every tool and every data source, and the work starts over with each new combination. A standard interface reverses the arithmetic: whoever exposes a tool describes it once, whoever builds a harness knows how to read that description, and the two sides evolve separately. The acronym names a context protocol intended for models, published as an open specification, which is why it belongs to no product in particular.
What travels
What travels is description and result, never intelligence. A connected service announces what it can do and what it can supply; the harness takes those announcements, places them in the context, and the model can then call for an action through tool calling. The circuit therefore remains the usual one: the model asks, the harness executes, the result comes back as text. The protocol changes the way the harness reaches the tool, not the way the model decides, and it dispenses with none of the controls you would place around a hand-written tool.
What has changed
The protocol has stopped carrying only text. A standardised extension lets a service deliver, in reply to a call, a complete interface that the host software displays inside the conversation: a chart you explore, a form you fill in, a player you operate. This interface runs isolated from the rest of the application, in a frame that prevents it from reaching the page containing it, and everything it asks for goes back through the control path of an ordinary call. The shift matters for two reasons. A service’s reply is no longer only read by the model, it is seen and handled by a person, which steps outside the “everything is text” regime that governs the rest of this glossary. And the surface of trust widens: accepting a service is no longer only accepting its descriptions, it is accepting display code written elsewhere.
The risk displaced
Ease of connection displaces the risk rather than removing it. Connecting a source becomes a matter of minutes, whereas deciding who has the right to query it, on which data and with what trace remains a whole piece of governance work. A question of trust is added: a connected service describes its own tools, and that description is text the model is going to read, hence a way in for unwanted instructions. Finally, each connected source takes up room in the context and draws on the model’s attention: a harness overloaded with connections chooses worse, not better.
Under the hood3 steps · the real shape of the objects
The protocol comes down to one envelope (JSON-RPC 2.0) and two gestures: a service declares itself, the host makes use of the declaration. What it announces may be a tool, a document, and lately an interface. The three steps below follow that order.
- 01
What a service announces
A service’s reply to the question “what can you do?”. It is the ordinary tool declaration, carried by a standard envelope: what the protocol standardises is the transport and the names, not the principle.
{ "jsonrpc": "2.0", "id": 3, "result": { "tools": [ { "name": "city_weather", "description": "Seven-day forecast for a city.", "inputSchema": { "type": "object", "properties": { "city": { "type": "string" } }, "required": ["city"] }, "_meta": { "ui": { "resourceUri": "ui://weather/table", "visibility": ["model", "app"] } } } ] } }- jsonrpc
- The same envelope for everything: listing, calling, reading a document. That is the whole economy of the protocol, and the reason why changing service does not require rewriting the harness.
- inputSchema
- The same object as a tool declaration written by hand, down to the name of the field. The model will never know where this description comes from: the harness presents it like the others.
- _meta.ui
- The hook towards an interface. Its presence announces that this tool’s reply can be displayed rather than read, and lets the host load and inspect the interface before the very first call.
The trapThe description comes from the service, therefore from a third party, and it ends up in the context the model reads. A connected service literally writes part of your prompt: this is the way in that layer 2 points to, and it is here, in this field.
- 02
When the reply is an interface
The resource named above. It is neither an image nor a template with gaps to fill: it is a complete page, loaded by the host and not by the model, which will never see its code.
{ "uri": "ui://weather/table", "name": "weather_table", "mimeType": "text/html;profile=mcp-app", "_meta": { "ui": { "csp": { "connectDomains": ["https://api.example.org"], "resourceDomains": ["https://cdn.example.org"] }, "prefersBorder": true } } }- ui://
- An address scheme reserved for interfaces. It cannot be reached from a browser: only the host resolves it, through the protocol.
- mimeType
- The type that declares “this is an interface, not a document to read”. It is what switches the host from text mode to display mode.
- csp
- The only outside origins the page will be able to reach. Everything else is refused by default: the isolation is not declared by the service, it is imposed by the host.
The trapThis is the point that steps outside the usual regime of the glossary. Everywhere else, what comes back from a tool is text that the model reads; here, what comes back is code that the person sees. The model, for its part, still sees nothing but text.
- 03
What the interface is allowed to do
The displayed page can execute nothing itself: it asks, and the host arbitrates. The channel is a simple exchange of messages between the isolated frame and the page containing it, in the same JSON-RPC envelope as the rest.
// inside the isolated frame: the view introduces itself, then waits to be fed await host.request('ui/initialize', { appCapabilities: {} }); host.on('ui/notifications/tool-result', (r) => draw(r.content)); // the person clicks: the view does nothing, it ASKS button.onclick = () => host.request('tools/call', { name: 'city_weather', arguments: { city: 'Lyon' }, }); // the host then applies the consent and the rights of the session, // exactly as if the model had produced the request itself. // An interface therefore opens no shortcut: it takes the same // point of control, that of execution.- ui/initialize
- The handshake. The view announces what it can do, the host replies with what it allows: opening a link, writing into the conversation, calling this tool and not that one.
- tools/call
- The same method as the model’s. This is the architectural guarantee of the extension: two requesters, a single path of execution, therefore a single place to control and to log.
The trapThe isolated frame prevents the page from reaching the host application, its tokens and its storage. It does not prevent what the page displays from being misleading: a button may carry a label that does not match the call it triggers, and it is the host, not the service, that has to show what is really going to run.
- tool callingthe loop turn and the four controls, identical whether the tool comes from here or from elsewhere
- contextwhere the descriptions announced by each connected service land
What variesThis is the only block in the glossary whose content follows a dated specification, therefore the only one to re-read when it moves: the core of the protocol is versioned by revision date, and the extension that carries the interfaces is versioned separately. The method and field names cited here hold for the revisions in force at the date of this card. What does not vary: a JSON-RPC envelope, a service that describes without ever executing on your side, a host that remains the sole point of execution, and an isolated interface that has to go back through that point like everyone else.
Relations where the neighbours live
Check 3 questions · click your answer
Level 1 · Recognise
A product announces that it supports this protocol. What does that tell you about its model?
Level 2 · Distinguish
What is the difference between exposing a programming interface and exposing a service compliant with this protocol?
Level 2 · Distinguish
You connect three new data sources through this protocol. What have you gained?
Lexigraph, "MCP", v2026-08, https://www.lexigraph.org/en/mcp/, CC BY 4.0.