Skip to content
Writing
AI · part 1 of 105 min read

What a harness is, drawn

Model, harness, interface, tools, MCP and agent: six words people mix up, sorted with one kitchen. Theo's explainer, drawn.

Meer Habib

Senior Mobile Engineer · Chittagong

"Harness" is the word everyone in AI uses and almost nobody defines. Theo got tired of explaining it and wrote a whole article on it. It's the clearest one I've read. This is that article retold, sketched the way he sketches, with one kitchen carried all the way through so every word has a place.

The cast

Six words, one kitchen. Keep this picture in mind; everything below is just a closer look at one card.

Modelthe chefHarnessthe kitchenToolspots and knivesMCP servera cookbookInterfacethe dining roomAgentchef + kitchen
Fig. 1Six words people mix up, and where each one sits in the kitchen.

People use interfaces

You never write code to open a file or send an email. You click a button, press a shortcut or type a command, and the code behind it runs. You see the interface, not the code. Chrome, the Claude app and a terminal are all interfaces.

People seeinterfacesModels seeharnessesInterfaceClaude CodeChatGPT app, T3 CodeHarnessClaude Agent SDKCodex App Server, Pi
Fig. 2The person only ever touches the interface. The model only ever touches the harness.

Models use harnesses

A language model can do one thing: write text. It can't click anything. So we agree on a text format that means "run this", and the model learns to write it. But a line like <read_file name="README.md"> is still just text. Typed into nothing, it does nothing.

Something has to read the reply, notice that format, run the right code and hand the answer back. That something is the harness. It's five pieces:

ModelHarnessread_filea tool1tools: read_file(name)2<read_file "README.md">3spots the call4fs.readFile(...)"# Mend, a calm journal"5the file, as text
Fig. 3One tool call, end to end. The model only writes step 2. Everything else is the harness.

That's it. A list of tools, a way to call them in text, a parser, the tools themselves, and a way back. Run it in a loop and the model can work for hours. I go deeper on the loop in how agentic systems work.

Claude Code is two things

When you type claude in a terminal, or open the Code tab in the desktop app, you're looking at an interface. Neither of those is the harness. Underneath, both run on the Claude Agent SDK. Codex works the same way: the app talks to the Codex App Server, which ships inside the CLI.

The confusion is fair, because both products bake their harness into the app. But the harness is a separate part, and other apps reuse it.

= Claude Code= Codexinterfaces · you see theseharnesses · hiddensame harnesses, other appsclaude, in a terminalCode tab, Claude appChatGPT appT3 CodeOpenClawGrok BotClaude Agent SDKCodex App ServerPiCursor's harness
Fig. 4Each product is an interface on a harness on a model. The harnesses travel: these are the examples Theo gives.

Who owns the tools

No kitchen has every tool a chef will ever want, and a good harness knows that. It ships with the important ones (reading and editing files, a shell, search) and lets you bring the rest: a TypeScript checker, computer control, your own.

How much comes in the box varies a lot. Claude Code and Codex include plenty. Pi includes very little on purpose.

The part that clears things up: neither you nor the model can see the tools directly. The harness shows them to the model as descriptions and to you as buttons and logs. If the harness doesn't expose a tool, as far as everyone is concerned, it doesn't exist.

Tool planecode that runs in the harnessTypeScript pluginchecks your typesbashread_fileedit_filesearchsubagentComputer usescreenshotclick, typeYouInterfacethe app you useHarnessAgent SDKCodex, PiModel
Fig. 5Built-in tools and plugins all live in the tool plane. Neither you nor the model can reach them except through the harness.

Tools and MCP

MCP, the Model Context Protocol, is a standard way for a harness to reach things outside itself. The difference with a tool is where the code lives. A tool runs code here, like a Chrome extension you install. An MCP server runs code somewhere else, like a website: nothing to install, you just need the URL.

Tool planecode that runs in the harnessTypeScript pluginchecks your typesbashread_fileedit_filesearchsubagentComputer usescreenshotclick, typeYouInterfacethe app you useHarnessAgent SDKCodex, PiModelData planecode that runs somewhere elsememoryCLAUDE.mdAGENTS.mdCutscene MCPSupabase MCPGitHub MCP
Fig. 6Add the data plane: MCP servers and memory files the harness reads in. The code behind an MCP server runs somewhere else.

The most common reason to use MCP is data. Want the model to read your email or your analytics? That data lives on someone else's server, so an MCP server is the natural plug. I compare MCP with plain CLIs in MCP and CLIs.

In the kitchen, an MCP server is a cookbook. It describes how to make something, but it isn't the pans or the stove. Hand a cookbook to a kitchen and nothing about how the kitchen works changes. The chef can use it or ignore it.

The restaurant

Theo's own app, T3 Code, shows why this matters. It lets you run Claude Code's harness or Codex's harness side by side, and it adds things neither does alone, like a Claude thread starting a subagent in Codex.

It could have rebuilt those features as a plugin for every harness out there. Instead, the code stays in T3 Code, and each harness gets a small MCP server it can call. One cookbook, offered to every kitchen.

youT3 Code · the restaurantClaude Code harnessthe kitchenchef: ClaudeCodex harnessthe kitchenchef: GPTT3 Code MCPthe cookbookopened only if asked
Fig. 7T3 Code is a restaurant you bring your own kitchen to. Its cookbook sits on the shelf until a chef is asked to open it.

So T3 Code isn't a harness. Without one, it does nothing.

So what's an agent?

A model on its own only writes text. A harness on its own is a kitchen nobody is cooking in. Put them together and you get an agent.

That's also why there are so many "agents". Most of them are the same few models in differently stocked kitchens: other tools, other instructions, other MCP servers.

Model+Harness=Agentsame model, three kitchens, three agentscoding agentfiles, shelltestssupport agentorders MCPrefund toolmotion agentCutscene MCPrender, preview
Fig. 8Different agents are mostly different harness setups around the same model.

My own tools sit in the cookbook slot. Cutscene and Shelf are MCP servers: Claude Code or Codex stays the kitchen, and my tool adds the recipes for motion design and App Store screenshots. Which kitchen you cook in is your choice.

Check yourself

ThingWhat it is
Claude, GPTModel: the chef
Claude Agent SDK, Codex App Server, PiHarness: the kitchen
read_file, bash, edit_fileTools: the pots and knives
A GitHub, Gmail or Cutscene serverMCP server: a cookbook
claude in a terminal, the ChatGPT appInterface: the dining room
Claude Code, CodexAn interface and a harness, sold together
T3 CodeA restaurant that brings in other kitchens
Model + harnessAn agent

The short version

  • A model writes text. A harness turns that text into actions and feeds the results back.
  • Apps like Claude Code are an interface on top of a harness. The harness is the hidden part.
  • Tools run code here. MCP servers run code somewhere else and are reached by URL.
  • Agent = model + harness. Change the harness and you've built a different agent.

All credit for the framing and the kitchen goes to Theo; the drawings, the cast and any mistakes are mine. If he explains something, it's usually worth reading the original, so here it is.

Next: how agentic systems actually work, the loop inside the kitchen.

Building something like this?

Booking new projects for Q4. Replies within 24h.