The End of Glue Code: Why MCP Is the USB-C Moment for AI Systems

Architecting the Zero-Glue AI Stack with the Model Context Protocol

A practical look at building protocol-driven AI systems with the Model Context Protocol (MCP).

Two years ago, if you wanted an AI agent to perform a task—auditing a rare book archive, updating a Notion database, or reconciling records in a system—you had to write a custom integration layer.

Traditional AI integrations (M × N complexity)

A flowchart illustrating the M x N integration problem. Two AI models (Model A and Model B) are shown with individual, overlapping lines connecting directly to three separate tools (Tool A, Tool B, and Tool C), creating a dense, brittle "spaghetti" architecture.
Figure 1: The exponential complexity of traditional point-to-point AI integrations, where every new model requires a unique connector for every available tool.


You spent weekends mapping JSON fields to LLM function calls, building fragile wrappers around APIs, and hoping the upstream interface didn’t change.

When it did, everything broke.

We were building a tangled web of point-to-point integrations.

In software engineering terms, this is the M × N problem:

M models x N tools = MxN integrations

Every new model required new connectors.
Every new tool required new wrappers.

By 2026, that architecture has become a technical liability.

A different model is emerging: protocol-based AI systems.

And the protocol at the center of that shift is the Model Context Protocol (MCP).


The Protocol Shift: What MCP Actually Is

The Model Context Protocol is an open standard for connecting AI systems to tools and data.

The easiest analogy is USB-C for AI infrastructure.

Where does MCP actually sit in an AI system?

Layered architecture diagram of an MCP-based AI system showing applications, agent orchestration, the Model Context Protocol layer, tools and resources, and underlying data systems.
The MCP architecture stack: agents reason about tasks while MCP standardizes access to tools, resources, and enterprise data.

Instead of building custom integrations between every model and every tool, developers implement a single MCP server that exposes capabilities in a standardized way.

Agents then discover and use those capabilities dynamically.

In this architecture:

Protocol-based architecture (M + N complexity)

A hierarchical architecture diagram showing an AI Agent connecting via the MCP Protocol to an MCP Server. The server manages three distinct primitives—Tools, Resources, and Prompts—which in turn interface with underlying databases, APIs, and enterprise systems.
Figure 2: The Model Context Protocol (MCP) acts as a universal interface, allowing a single agent to dynamically discover and orchestrate tools, resources, and prompts via a unified server.


Rather than hard-coding what a model can access, the server describes its capabilities to the agent.

When an agent connects, it performs a protocol handshake and discovers exactly what is available.

No manual wiring required.

A side-by-side comparison. The left side shows a "Spaghetti" model with multiple models criss-crossing connections to tools. The right side shows the "Hub-and-Spoke" MCP model, where models and servers connect through a central MCP Standard, demonstrating a cleaner and more scalable system design.
Figure 3: Comparing the linear scaling of MCP (M + N) against the unsustainable growth of traditional manual wiring (M x N).



The Three Primitives of MCP

MCP works because it simplifies tool integration into three core primitives.

1. Resources (The Nouns)

Resources are structured data exposed to the agent.

Examples might include:

  • a rare book’s metadata record
  • a digitized archival scan
  • a Notion page
  • a database entry

The key point: the agent doesn’t scrape or guess.
It accesses structured resources intentionally exposed by the server.


2. Tools (The Verbs)

Tools are executable actions.

An MCP tool is essentially a function with a strict schema that tells the agent how to call it.

Example:

// Define a tool in the MCP Forensic Analyzer
server.tool(
"audit_book",
{ book_id: z.string().describe("The archival ID of the volume") },
async ({ book_id }) => {
const metadata = await archive.getMetadata(book_id);
const result = await forensicEngine.audit(metadata);
return {
content: [{ type: "text", text: JSON.stringify(result) }]
};
}
);

Because tools include a JSON schema, the model knows:

  • what parameters exist
  • which are required
  • what type of result will be returned

This dramatically improves reliability compared to traditional prompt-based tool use.

3. Prompts (The Recipes)

Prompts define reusable workflows.

Instead of embedding a fragile 500-line system prompt inside your application, you can expose a structured prompt template.

Example:

Forensic Audit Template
- Retrieve metadata
- Check publication year consistency
- Verify publisher watermark
- Compare against known first-edition patterns

The agent can then dynamically load and use that prompt when performing an audit.

Case Study: The MCP Forensic Analyzer

To explore MCP in practice, I built an MCP Forensic Analyzer.

The system analyzes archival records and identifies inconsistencies between historical metadata and physical characteristics.

Before MCP, implementing this workflow required a large amount of orchestration code:

  1. Fetch metadata
  2. Normalize fields
  3. Construct prompt
  4. Send to LLM
  5. Parse result
  6. Retry if formatting failed

With MCP, the architecture becomes dramatically simpler.

The agent discovers available tools and invokes them directly.

The MCP Discovery Loop

Instead of manually wiring integrations, the agent follows a protocol lifecycle.

  1. Protocol Negotiation

The client and server establish a connection
(STDIO for local tools or SSE for remote services).

  1. Schema Exchange

The server returns a manifest of available tools, resources, and prompts.

  1. Intent Mapping

The agent matches the user request to the appropriate tool.

  1. Tool Execution

The tool is invoked with structured parameters.

A sequence diagram involving a User, AI Agent, Archival MCP Server, and Data Layer. It shows the agent requesting a tool list, the server returning forensic tools, the agent selecting 'audit_book', and the server querying the database to return a structured forensic result back to the user.
Figure 4: The MCP Handshake and Discovery Loop. The agent identifies capabilities at runtime rather than relying on hard-coded instructions.


Unlike traditional systems that cram every tool into the system prompt, MCP allows the agent to fetch the tool definition only when its reasoning engine determines it is required. The important shift here is that the agent discovers the system instead of being manually wired to it.

Why MCP Is Emerging Now

Three shifts in AI architecture made MCP almost inevitable.

  1. Agents Need Tool Discovery
  • Hard-coded function lists don’t scale as systems grow.
  • Agents need the ability to discover capabilities dynamically.
  1. Context Windows Exploded
  • Modern models can reason over large tool catalogs and schemas.
  • Instead of embedding everything in a single prompt, agents can now navigate structured capability manifests.
  1. Enterprises Need Governance
  • Prompt-level guardrails are brittle.
  • Protocol-level permissions are enforceable.
  • MCP moves governance into the infrastructure layer.

MCP + Agentic Memory

Another emerging pattern in 2026 is combining MCP with agent memory systems.

MCP provides the agent’s eyes and hands.

Memory provides the identity.

In the MCP Forensic Analyzer, memory operates on two levels.

Working Memory
– The specific book currently under investigation.

Semantic Memory
– A vector database storing historical observations.

Example:

“First editions from this publisher often contain a watermark on page 12.”

As the system performs more audits, it accumulates domain-specific knowledge.

The agent doesn’t just run tools.

It develops forensic intuition.

Enterprise Governance: Why REST Isn’t Enough

A common question is:

“Why not just use REST APIs?”

REST APIs were designed for application integrations, where developers explicitly code each interaction.

MCP targets a different use case: machine-to-machine autonomy.

Three architectural advantages emerge.

1. The M×N → M+N Scaling Shift

Without MCP:

M models × N tools = M×N integrations

With MCP:

M models + N MCP servers = M+N integrations

A new model can immediately interact with existing systems without additional integration work.

2. Permissioned Recall

Enterprise systems require strict data boundaries.

An MCP server can enforce Row-Level Security (RLS) at the protocol layer.

If a junior auditor runs the agent, the server only returns resources they are authorized to access.

The agent literally cannot see restricted data.

3. Auditability

Enterprise AI systems must be explainable.

MCP provides structured logging for:

  • tool calls
  • resource access
  • returned data

This creates a defensible audit trail of every decision made by the agent.

From Hackathon Projects to Production Systems

One MCP example experiment I did occurred for the Notion MCP Challenge.

That project proved the protocol works.

The next step is evolving that prototype into a Production AI Mesh.

In upcoming posts in this series we’ll explore:

  • Multi-Agent Handoffs
    (specialized agents collaborating)
  • Edge AI with Small Language Models
    (running agent systems without large GPU infrastructure)
  • Enterprise Governance Layers
    (secure, auditable AI systems using databases like Oracle 26ai)

MCP is no longer just a developer curiosity.

It’s becoming the foundation for production-grade agent architectures.

Ready to Explore the Code?

Repository
MCP Forensic Analyzer

Learn More About the Protocol
Model Context Protocol Documentation

Up Next in the “Zero-Glue” Series:
– The Forensic Team: Multi-Agent Handoffs and Orchestration.
– AI on a Toaster: Running SLMs on the Edge.
– The Secure Archive: Governance with Oracle 26ai.

Facebooktwitterredditlinkedinmail

Get Cooking with ChatGPT

ChatGPT from OpenAI has been getting a lot of publicity recently. If you haven’t heard of it, ChatGPT is an acronym for Chat Generative Pre-trained Transformer. What does that mean? It’s a chatbot that’s been tuned through reinforcement and supervised learning. There has been much discussion about the accuracy and usability of ChatGPT.

ChatGPT Models

ChatGPT currently offers three different models for response generation. They have different capabilities and come with different pricing. The models are:

  • GPT-3, for understanding and generating natural language.
  • Codex, for understanding and generating software code.
  • Content filter, for determining whether text may be sensitive or unsafe

Being in the software industry, the Codex model is intriguing, but I have yet to see examples of auto-generated code that does exactly what I’m trying to accomplish. Therefore, having previous experience in the culinary industry I thought it would be interesting to try ChatGPT in that arena using the GPT-3 model. Let’s see what sort of recipes ChatGPT can generate and how true to the classic recipes they are.

There are four different model options available when using the overall GPT-3 model: text-ada-001, text-babbage-001, text-curie-001, and text-davinci-003. The models go along a speed/cost scale of fast & inexpensive with text-ada-001 to the most capable but slower & more expensive text-davinci-003. While fine-tuning these models is an option, it goes beyond the scope of this post. With that in mind, let’s look at what these different models can generate for us “out of the box.”

The Recipe

In classical French cuisine, there are five mother sauces on which other sauces are based. To test out ChatGPT’s recipe generation, let’s look at one of these classic sauces: Béchamel. Béchamel is a simple sauce, from a classic ingredient standpoint, in that it contains butter, all-purpose flour, milk, salt, and pepper.

Let’s write a brief Python application that we’ll use to access the OpenAI API and see what responses we get from ChatGPT.

First, we’ll need to get an account with OpenAI and an API Key. As a best practice to keep your API Key safe, using an API Vault, such as Pangea’s Vault is a great idea. At a bare minimum, assign it to an environment variable so you can access in your application but not need to save the key in your code file.

Second, we’ll need to install OpenAI using a package management tool such as pip or pipenv. I prefer pipenv, so running the following command will get that installed:

pipenv install openai

Now, in a Python file, chatgpt-python.py, we’ll make a “How do I make bechamel sauce?” request to OpenAI using the four different GPT-3 models:

import openai
import os

openai.api_key = os.environ['OPENAPI_APIKEY']

# Choose the model engine
model_engines = ["text-ada-001", "text-babbage-001", "text-curie-001", "text-davinci-003"]

# The question passed into the API
prompt = "How do I make bechamel sauce?"

for model_engine in model_engines:

     # Response generation
     generator = openai.Completion.create(
          engine=model_engine,  # (REQUIRED) - the model to use
          prompt=prompt,  # (OPTIONAL) - the prompt that's passed to the API
          max_tokens=1024, # (OPTIONAL) - the max # of tokens to generate
          n=1,  # (OPTIONAL) - how many completions to generate
          stop=None,  # (OPTIONAL) - stop word string or array.
          temperature=0.5.  # (OPTIONAL) - the coherency of the generated response. Number between 0 and 2
)

     generated_response = generator.choices[0].text
     print("Response for " + model_engine + ": ")
     print(generated_response)

In the response generator, we have a few options, and we’re defining the model engine, passing in the prompt, defining the number of tokens used from the API (default is 16), and how many completions are generated for each prompt (default is 1), any stop sequences we want to define to stop further token generation, and the temperature of the response.

What is the temperature? It defines the randomness (coherency) of the generated response. Lower numbers here make the responses more focused and higher numbers generate more random output. We’ll explore this in a bit. For now, here are the responses I got from the above script. Remember that we’re looking for an answer to the question of “How do I make béchamel sauce?”

text-ada-001 (.50 second response)

There is no one definitive way to make bechamel sauce. However, most likely you will need to use grated cheese, milk, and butter.

Hmmm, that doesn’t really seem helpful and while there are sauces based on a bechamel that include cheese the base sauce doesn’t.

text-babbage-001 (0.61 second response)

Place a pot of water on the stove to boil. Add a cup of sugar and cook until the sugar has dissolved. Add a cup of milk and cook until the milk has boiled off. Pour the sauce into a saucepan and stir in the bechamel sauce ingredients. Cook over low heat until thickened.

Again, not spectacularly useful, for classic béchamel with sugar being mentioned. Also, what is a “pot of water” exactly? 1 cup, 1 quart, 5 gallons? I’m not sure what “until the milk has boiled off” means in this context either. And then, a very cyclical instruction for how to make bechamel sauce: “stir in the bechamel sauce ingredients.”

text-curie-001 (.84 second response)

Bechamel sauce is a simple sauce made from milk and flour. Heat milk in a saucepan over medium heat until it starts to simmer. Whisk in flour until a smooth paste forms. Cook, stirring constantly, until the sauce thickens. Serve hot.

Getting closer here, but still not quite there. Using straight flour to thicken milk doesn’t create a great flavor. However, even without measurements, you could generate something here, right? Even with 100 gallons of milk being heated to a simmer you know that you must add in enough flour until a “smooth paste forms.” Still, far from a classical béchamel sauce.

text-davinci-003 (7.3 second response)

Bechamel sauce is a classic French sauce made from a roux of butter and flour, and a liquid, usually milk. Here is a basic recipe:

Ingredients:

-3 tablespoons butter
-3 tablespoons all-purpose flour
-2 cups milk
-Salt and freshly ground pepper
-Pinch of ground nutmeg

Instructions:

1. Melt the butter in a saucepan over medium heat.
2. Add the flour and whisk until the mixture is smooth and bubbling.
3. Gradually whisk in the milk, whisking constantly to avoid lumps.
4. Continue to whisk until the sauce thickens, about 5 minutes.
5. Season with salt, pepper, and nutmeg.
6. Serve warm.

This is a recipe that one could work with. I’d have a few nit-picks with the instructions, but overall, it makes sense. Personally, I wouldn’t add the nutmeg and it isn’t explicitly classical, but I’ve seen it done.

Temperature Adjustment

As mentioned earlier, the temperature parameter adjusts the “coherency” of the generated output. You can set that parameter to a number between 0 and 2. Recall that the above script ran with a temperature parameter of 0.5. The output was, while not always helpful, at least coherent.

The output from the text-davinci-003 model was useful. Let’s see what happens if we alter the temperature parameter value.

temperature=1.75

Bechamel is one of the staples in employing tha classic “mother tastes” that understands fundamental techniques, which are included bases like Bechamel felt se as Milk, simple sugars /mutable faster blend together all seeds again serve holes along veggies traditional

That’s just the introduction, the rest of the “recipe” isn’t much better…

To make béchamel classic:

1 MELT 2 tablespoons worthwhile normal core puns international info and work users tub back stainless stre ‘tub fully restricted sized documents allowed uses principle-friendly views data

… and it goes on but becomes less coherent.

temperature=0.2

Let’s go in the other direction and reduce the temperature parameter value. Here are the results:

Bechamel sauce is a classic French white sauce made with butter, flour, and milk.

Ingredients:

– 2 tablespoons butter
– 2 tablespoons all-purpose flour
– 2 cups milk
– Salt and pepper to taste

Instructions:

1. In a medium saucepan, melt the butter over medium heat.
2. Add the flour and whisk until the mixture is smooth and bubbly.
3. Gradually add the milk, whisking constantly until the mixture is smooth.
4. Bring the mixture to a boil, then reduce the heat and simmer for 5 minutes, stirring occasionally.
5. Season with salt and pepper to taste.
6. Serve over your favorite dish. Enjoy!

Another great béchamel recipe, and this time without nutmeg!

I don’t believe you. You’re an impasta!

As we’ve seen using OpenAI and ChatGPT can have some interesting results. You might wind up with some imposter recipes or you might wind up with some winners. That is true overall, in my opinion, for AI-generated content now though. Could you build an entire application strictly based on results from ChatGPT? Perhaps. Individual results may vary though.

As the models get better, get more use, and “learn” more, things might change. And recipe creation is just one small example of this technology. We see folks attempting to use it in areas such as courtrooms, health care, insurance, and more. In comparison, culinary uses seem safe. Just based on the varying results of a béchamel sauce recipe, I think we have a ways to go with this technology.

Facebooktwitterredditlinkedinmail