Field notes · protocol design

The quiet plumbing
that lets an agent
reach for a tool.

Model Context Protocol, plainly explained — how it works, what it isn't, and how it bears on connecting your own chat product to somebody else's.

Scroll — six short sections
Why it exists

Every agent, every tool, its own custom wire.

Before MCP, connecting a model to a database, a calendar, or a CRM meant writing a bespoke integration for that exact pairing. An organisation with 6 agents and 10 tools faced up to 60 one-off integrations — each with its own auth pattern, its own way of describing what it does, its own failure modes.

agents (gold) × tools (mint)
MCP
N agents × M tools = N×M custom integrations to build and maintain.
The mechanism

Three roles, one grammar.

MCP is a specification: a shared grammar for how an AI application asks what's available, and how it asks for something to be done. Three roles do the work.

Host

The application

Your chatbot, IDE, or agent runtime. It's what the person actually talks to, and it holds the conversation.

Client

The connection

Lives inside the host, keeps one dedicated 1:1 link open to a server, and speaks MCP on the host's behalf.

Server

The capability

A small program that exposes a specific set of tools, data, or templates — e.g. "our booking system" or "internal wiki search."

Messages between them are plain JSON-RPC 2.0, carried over stdio for a server running on your machine, or over HTTP for a remote one. Nothing exotic — the value is entirely in everyone agreeing to describe things the same way.

A server can expose three kinds of thing, and who decides to use each one differs:

Model-controlled. The LLM itself decides, mid-reasoning, to call one — the way it already decides to call any function.

{
  "name": "get_portfolio_valuation",
  "description": "Return the current valuation of a client's portfolio.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "client_id": { "type": "string" },
      "as_of_date": { "type": "string", "format": "date" }
    },
    "required": ["client_id"]
  }
}

Application-controlled. The host decides what to attach as background context — a file, a record, a page — before the model ever reasons about it. Think of it as read-only material handed to the model, not something the model requests mid-thought.

User-controlled. Reusable, parameterised instruction templates a person explicitly invokes — a slash command, a saved workflow — rather than something the model reaches for on its own.

Agent ↔ tool

How a tool call actually happens.

This is the part that enables an agent to "talk to tools" — a fixed sequence, the same regardless of which tool sits behind it.

1
2
3
4
5

Discover

On connecting, the client asks the server what it offers. The server replies with a list of tools, each with a name, a plain-language description, and a JSON Schema for its inputs — this is the part the model actually reads.

Decide

Those tool descriptions get folded into the model's context alongside the conversation. Mid-reasoning, the model decides a particular tool fits the current step, and emits a structured call with arguments — ordinary function-calling, just against a standardised list.

Invoke

The client packages that as a tools/call request and sends it to the server over the open connection.

Execute

The server runs the underlying code — a database query, an API call, a file read — outside the model entirely, and returns a structured result or an error.

Resume

The result is inserted back into the conversation as if the model had just been handed a document. The model reads it and continues reasoning — possibly straight into another tool call.

Does MCP do agent-to-agent?

No — MCP reaches down. A2A reaches sideways.

MCP connects one agent to its own tools and data — vertical, like roots drawing from soil the tree already owns. Getting two independent agents, run by two different systems, to collaborate as peers is a different problem, with its own emerging standard: A2A (Agent2Agent Protocol), originally published by Google and now developed as an open, multi-vendor project under the Linux Foundation.

Agent A · its own tools (MCP) Agent B · its own tools (MCP) A2A — peer task exchange
Mint roots — each agent's own MCP connections (private, vertical) Gold dashed line — A2A between agents (peer, horizontal)
MCPA2A
DirectionAgent → its tools and dataAgent → another, independent agent
Unit exchangedA tool call and its structured resultA task, delegated and tracked to completion
What's visibleFull tool schema — the caller sees exactly what a tool doesAn "agent card" advertising capabilities only — internals stay opaque
Typical shapeSynchronous, within one turn of reasoningCan be long-running and asynchronous

In practice the two nest: Agent B might use A2A to accept a task from Agent A, then quietly use its own MCP connections to actually carry it out. Neither replaces the other.

Where harness engineering fits

MCP is the wiring. The harness is the loop.

The "harness" is the scaffolding code that runs around the model: the loop that decides what goes into context, calls the model, interprets what comes back, executes tool calls, and repeats. MCP standardises the last mile of that loop — how the harness reaches outward. It doesn't decide when to loop, what to remember, or when to stop.

Perceive Plan Act Observe harness
Perceive — context engineeringWhat actually goes in the window this turn: system prompt, retrieved memory, prior turns, and which tool schemas to even show the model. More MCP servers means more schemas competing for the same budget — good harnesses load tool definitions selectively rather than dumping every connected server in at once.
Plan — the model reasonsOrdinary model inference: given what's in context, what's the next step.
Act — MCP does its job hereIf the plan calls for a tool, the harness routes that call through an MCP client to the right server and waits for a result.
Observe — and loopThe result re-enters context, and the harness decides: call the model again, ask the person a question, or stop.
The practical question

Linking your chatbot to a different org's GenAI chat: API or MCP?

Neither is strictly "more correct" — they answer different questions. A plain API call answers "how do I invoke this one function." MCP answers "how does my agent discover and reason about a changing set of capabilities, uniformly, alongside everything else it already talks to."

Start here — how will your side actually use the other org's chat?

Whichever you pick, the protocol choice is the smaller decision. These matter more once real user data starts crossing an org boundary:

Trust boundary & auth+
Scope credentials tightly (a limited API key or OAuth token, not shared internal auth), and never let the external system's response trigger actions in your own system without review.
Data governance+
Decide exactly what leaves your side — ideally a scoped question, not full account or conversation history — and get it reviewed wherever your institution's data-sharing and vendor-risk process lives before anything ships.
Context to forward+
Send the minimum needed for a good answer — usually the current question plus a short summary, not the raw transcript. Smaller payloads are cheaper, faster, and leak less.
Guardrails on the way back+
Treat whatever the external chat returns as untrusted input to your own model — the same as any other tool result — not as an instruction to follow.
Disclosure+
If a different organisation's model is now effectively answering, the person is usually owed a clear signal of that — particularly in a regulated setting.
Latency & fallback+
An extra network hop to another org's infrastructure needs a timeout and a graceful fallback for when their side is slow or down.
Versioning+
A plain API integration silently breaks when their contract changes. MCP's discovery step means your agent re-reads the current tool list each session — one real advantage of the extra plumbing.
Audit trail+
Log what was sent out, what came back, and when — cross-org AI calls are exactly the kind of thing a compliance review will later ask to see.