Vertical vs. Horizontal Agent Communication: MCP vs. A2A
In our last post, we explored how a single agent talks to its "hands" (tools) using two different patterns: Function Calling (a direct request) and MCP (a conversational protocol).
But this leads to a new problem. This post is for you if you've ever built one of these "solo expert" agents and watched it grow into a 20-step "monolith" that's slow, expensive, and impossible to debug.
Today, we'll explore the next step in agent engineering: moving from a single "monolith" agent to a "team" of simple, specialized agents. We will compare MCP (Model Context Protocol) with A2A (Agent-to-Agent) communication.
The problem: The overloaded "monolith" agent
Let's say we want to build an agent that "writes a blog post about a new AI trend."
Using a single-agent approach, we'd build a complex graph for one agent to do everything.
graph TD
A[Start] --> B(Plan Outline)
B --> C(Search for Trend 1)
C --> D(Search for Trend 2)
D --> E(Draft Post)
E --> F(Critique Post)
F -- "Needs changes" --> B
F -- "Good" --> G[Final Post]
style B fill:#e3f2fd,stroke:#0d47a1
style C fill:#e3f2fd,stroke:#0d47a1
style D fill:#e3f2fd,stroke:#0d47a1
style E fill:#e3f2fd,stroke:#0d47a1
style F fill:#e3f2fd,stroke:#0d47a1
Why this is bad:
- It's Confused: The same agent (with the same LLM) is responsible for being a creative Researcher, a structured Writer, and a harsh Critic. It gets confused about its "role."
- It's Brittle: The system prompt is 5 pages long, trying to explain all these different jobs.
- It's Hard to Debug: If the final post is bad, which node failed? The
Draftnode, or theCritiquenode?
The solution: A "team" of specialists (A2A)
Instead of one "monolith" agent, what if we built a team of simple, specialized agents? This is the core idea of Multi-Agent systems (or "Agent-to-Agent" / A2A).
This requires two different types of communication:
- Vertical (MCP): How each agent talks "down" to its Tools.
- Horizontal (A2A): How agents talk "across" to each other.
graph TD
A[Agent 1: Manager] -- "Horizontal A2A: Delegate Task" --> B[Agent 2: Researcher]
B -- "Horizontal A2A: Send Report" --> A
B -- "Vertical MCP: Call Tool" --> C(Tool: Web Search)
C -- "Vertical MCP: Get Results" --> B
style A fill:#e3f2fd,stroke:#0d47a1
style B fill:#e3f2fd,stroke:#0d47a1
style C fill:#e8f5e9,stroke:#388e3c
They are not competitors; they are two different layers in a complete agent stack.
1. MCP: Vertical communication (Agent-to-Tool)
As we learned in our previous post, MCP (Model Context Protocol) is how a single agent connects to its external resources.
- Philosophy: "Empower one agent with dynamic, conversational access to its tools."
- What it does: Enables tool discovery, requests, and updates via a server.
- Communication: Vertical (Agent talks to Tool).
- Best For: Enhancing an individual agent's capabilities with real-world access.
Observation: MCP is "agent-centric"—it boosts one agent's power. It doesn't handle how that agent collaborates with other agents.
2. A2A: Horizontal communication (Agent-to-Agent)
A2A (Agent-to-Agent) is a protocol (or a pattern) for agents to communicate directly with each other.
- Philosophy: "Agents are a team. Let them collaborate, delegate, and negotiate like a team."
- What it does: Supports messaging, task delegation, and shared state between agents.
- Communication: Horizontal (Agent talks to Agent).
- Best For: Multi-agent systems where tasks are divided (e.g., a "Planner" agent, an "Executor" agent, and a "Critic" agent).
The "How" (Visualized with CrewAI/LangGraph)
We don't build one complex "brain." We build a team of simple agents and link them together.
graph TD
A[User Goal: Write blog post] --> B(Manager Agent)
B -- "Task 1: Research trends" --> C[Agent 1: The Researcher]
C -- "Research Document" --> B
B -- "Task 2: Write draft using Research Doc" --> D[Agent 2: The Writer]
D -- "Blog Draft" --> B
B -- "Task 3: Edit draft" --> E[Agent 3: The Editor]
E -- "Final Polished Post" --> B
B --> F[Final Answer]
style B fill:#e3f2fd,stroke:#0d47a1
style C fill:#e8f5e9,stroke:#388e3c
style D fill:#e8f5e9,stroke:#388e3c
style E fill:#e8f5e9,stroke:#388e3c
The Code:
This is a conceptual example of how a multi-agent framework might handle A2A communication.
# This is a conceptual example, often handled by frameworks
# like LangGraph or CrewAI.
# 1. Define our specialist agents
planner_agent = Agent(name="Planner", ...)
executor_agent = Agent(name="Executor", ...)
# 2. Connect them with an A2A protocol (e.g., a shared message bus or graph)
# In LangGraph, this is just another edge
workflow.add_edge("planner_node", "executor_node")
# 3. The Planner "delegates" to the Executor
def planner_node(state):
plan = llm.generate_plan(state["goal"])
# The "A2A" part is just passing the state to the next agent
return {"current_task": plan.next_step, "plan": plan}
def executor_node(state):
task = state["current_task"]
# The Executor uses MCP (Tool Calling) to do its work
result = executor_agent.run(task)
return {"task_result": result}
Observation: A2A turns agents into a "team." Frameworks like CrewAI make this easy by abstracting the "Manager" logic. Frameworks like LangGraph make it explicit by having you build the "Manager" graph yourself. See our agent framework comparison for more.
The "Pro" solution: A2A + MCP
The key takeaway is that MCP and A2A are not competitors. They are complementary layers of a full agent stack.
- A2A (Horizontal) is the "collaboration" protocol for your team of agents.
- MCP (Vertical) is the "tool" protocol for each individual agent on that team.
A professional multi-agent system uses both.
graph TD
A[Manager Agent] -- "A2A: Delegate Task" --> B[Researcher Agent]
subgraph RESEARCHER["Researcher's Internal Process"]
B -- "MCP: Call Tool" --> C(Web Search Tool Server)
C -- "MCP: Get Results" --> B
end
B -- "A2A: Send Report" --> A
A -- "A2A: Delegate Task" --> D[Writer Agent]
subgraph WRITER["Writer's Internal Process"]
D -- "MCP: Call Tool" --> E(RAG/VectorDB Server)
E -- "MCP: Get Context" --> D
end
D -- "A2A: Send Draft" --> A
Head-to-head comparison
| Protocol | Focus | Communication | Use Case |
|---|---|---|---|
| MCP | Vertical (Agent-to-Tool) | Requests, Responses, Updates | Tool Integration (empowering one agent) |
| A2A | Horizontal (Agent-to-Agent) | Messages, Delegation, Negotiation | Team Collaboration (coordinating many agents) |
When to use what: Scenarios and recommendations
Scenario 1: "I have a single agent that just needs to access my company's (evolving) list of internal APIs."
- Choice: MCP (and/or Function Calling).
- Reason: This is a purely "vertical" problem. You don't need agent-to-agent communication.
Scenario 2: "I have a team of agents (a 'Planner' and an 'Executor') that need to solve a complex coding problem."
- Choice: A2A + MCP.
- Reason: You need A2A for the Planner to delegate tasks to the Executor. You then need MCP (or Function Calling) so the Executor agent can use its "tools" (like
run_code,read_file,search_web).
Challenge for you
- Use Case: You are building an autonomous "Research Team" with three agents: a
Searcher, aSummarizer, and aFactChecker. - Your Task: Describe the communication flow.
- What A2A messages are passed between the agents? (e.g.,
Searcher->Summarizer) - What MCP (or Tool Calling) calls does each agent need to make?
- What A2A messages are passed between the agents? (e.g.,
Key takeaways
- MCP handles vertical communication: Use it when an agent needs to interact with tools, APIs, or external services
- A2A handles horizontal communication: Use it when multiple agents need to collaborate, delegate tasks, or share state
- They are complementary, not competing: A professional multi-agent system uses both—A2A for agent collaboration and MCP for tool access
- Multi-agent systems reduce complexity: Breaking a monolith agent into specialized agents makes the system easier to debug, maintain, and scale
- Choose based on your architecture: Single agent with tools? Use MCP. Multiple agents collaborating? Use A2A + MCP
For more on building production AI systems, check out our AI Bootcamp for Software Engineers.