DEV Community

Marc Newstead
Marc Newstead

Posted on

MCP + A2A: You're Building Two Integration Layers Whether You Realise It or Not

The Problem You Probably Have Already

If you're building agentic systems in 2025, chances are you've already got two integration layers in your stack:

  • MCP (Model Context Protocol) — wiring your AI models to databases, APIs, filesystems, internal tools
  • A2A (Agent-to-Agent) protocols — letting your agents discover, negotiate with, and invoke each other

They're not competing. They're complementary. But without a clear interoperability story, you're setting yourself up for the kind of integration spaghetti that kept enterprise architects busy (and miserable) in the ESB era.

What MCP Actually Does

MCP is Anthropic's answer to a simple problem: how do you give an LLM structured, reliable access to external resources without writing bespoke glue code for every data source?

Instead of hardcoding database queries or API calls into your prompts, you expose them as MCP servers. Your AI client connects via a standard protocol, discovers available tools, and invokes them with typed parameters.

Example use case:

# MCP server exposes a tool
@mcp_tool
def query_customer_orders(customer_id: str) -> list[Order]:
    return db.execute("SELECT * FROM orders WHERE customer_id = ?", customer_id)
Enter fullscreen mode Exit fullscreen mode

Your LLM can now call query_customer_orders as a function — no prompt engineering, no brittle scraping, no hoping the model "figures it out".

MCP is vertical integration: connecting one agent to the resources it needs to do its job.

What A2A Actually Does

A2A is horizontal. It's about agents talking to other agents.

Imagine you've got:

  • A customer service agent that handles support tickets
  • A logistics agent that tracks shipments
  • A billing agent that processes refunds

When a customer asks "Where's my refund?", the support agent needs to talk to billing. That's A2A.

A2A protocols define:

  • Discovery: how does Agent A find Agent B?
  • Capability negotiation: what can Agent B actually do?
  • Invocation: how does Agent A call Agent B and handle the response?

Unlike MCP, A2A is still fragmented. There's no single standard. You might be using:

  • HTTP APIs with custom service meshes
  • Pub/sub queues (Kafka, RabbitMQ)
  • gRPC with Protobuf schemas
  • Proprietary frameworks from LangChain, AutoGen, CrewAI

Each works. None interoperate cleanly.

Why This Feels Familiar (and Not in a Good Way)

If you worked in enterprise integration in the 2000s, this smells like ESB déjà vu.

The Enterprise Service Bus promised to solve the n-squared integration problem: instead of every system talking directly to every other system, route everything through a central bus.

It worked — until it didn't. ESBs became:

  • Single points of failure
  • Performance bottlenecks
  • Proprietary lock-in traps (looking at you, TIBCO and WebSphere)

The two-layer stack emerging now — MCP below, A2A above — risks the same fate if we're not careful.

What You Should Do About It

1. Treat MCP as infrastructure, not application logic

MCP is brilliant for standardising resource access. Don't abuse it by cramming business logic into MCP tools. Keep them thin, composable, and stateless.

2. Pick one A2A pattern per bounded context

Don't mix pub/sub and RPC in the same workflow unless you have a damn good reason. Consistency beats flexibility when debugging multi-agent failures at 2am.

3. Design for replaceability

Whatever A2A framework you choose today will probably be legacy in 18 months. Wrap it. Abstract it. Make it swappable.

Example:

class AgentInvoker(Protocol):
    def invoke(self, agent_id: str, task: dict) -> dict:
        ...

class KafkaAgentInvoker(AgentInvoker):
    # Implementation today

class GrpcAgentInvoker(AgentInvoker):
    # Swap in tomorrow
Enter fullscreen mode Exit fullscreen mode

4. Monitor both layers separately

MCP failures look different to A2A failures:

  • MCP: "Tool not found", "Database timeout", "API key expired"
  • A2A: "Agent unavailable", "Circular dependency", "Message bus backlog"

Your observability stack needs to distinguish them.

The Boring Truth

There's no silver bullet yet. MCP is maturing fast, but A2A is still the Wild West. If you're building production agentic systems — especially in regulated industries or at scale — treat this as an architecture risk, not just a tooling choice.

You don't need to freeze development. But you do need to:

  • Isolate the integration layer
  • Version your agent contracts
  • Plan for migration

The teams that get this right won't be the ones with the cleverest agents. They'll be the ones who can rewire them without a full rewrite.


If you're evaluating MCP, A2A, or any other part of the agentic stack and want a second opinion, teams specialising in AI automation and software development can help you de-risk the architecture before you're too deep to reverse course.

But honestly? Just don't build another ESB. We've been there. It wasn't fun.

Top comments (0)