Enterprise·
advanced
·16 min read·Sep 12, 2026
By Rad Tome·Lead AI Systems Architect

Multi-Agent Tool Orchestration and Context Partitioning

Architecting deterministic multi-agent tool execution with Model Context Protocol (MCP), LangGraph, and CrewAI: Scoped tool partitioning, state isolation, and context compression.

multi-agentlanggraphorchestrationcrewaimcparchitecture
Interactive Tool
1-Click Export

Generate & Validate Multi-Client MCP Config

One-click export with environment variables & path locators for Claude Desktop, Cursor, Windsurf, and OpenAI Codex CLI.

Open in Generator

Multi-Agent Tool Orchestration and Context Partitioning

As organizations progress from single-turn chat assistants to autonomous multi-agent engineering workflows, naive tool assignment becomes an anti-pattern. Giving a single agent access to 50+ Model Context Protocol (MCP) tools simultaneously degrades reasoning quality: model attention degrades over bloated tool definition catalogs, prompt confusion leads to erroneous tool selection, and massive tool output payloads saturate context windows.

Solving this requires Multi-Agent Tool Orchestration with Context Partitioning. In this paradigm, a supervisor agent coordinates specialized subagents (e.g., Database Specialist, SRE Investigator, Code Refactorer), where each agent is provisioned with a strictly isolated subset of MCP servers and operates within an independent, partitioned context window.

This guide provides the architectural patterns, state isolation graphs, and a complete LangGraph implementation in Python for orchestrating multi-agent MCP toolchains.


1. Architectural Topology: Scoped Agent Tooling

Rather than connecting all MCP servers to a global context, an orchestrator routes subtasks to specialized agents. Each agent only receives the tools relevant to its specific domain.

mermaid
graph TD
    UserPrompt[User Goal: Investigate Incident & Fix Regression] --> Supervisor[Supervisor Agent: LangGraph Coordinator]
    
    subgraph Context Partition 1: SRE Agent
        Supervisor -->|Handoff: Triage Logs| SREAgent[SRE Investigator Agent]
        SREAgent <-->|Scoped MCP: k8s, cloudwatch| MCP_SRE[DevOps MCP Server]
    end

    subgraph Context Partition 2: Data Agent
        Supervisor -->|Handoff: Check Data Corruption| DataAgent[Data Analyst Agent]
        DataAgent <-->|Scoped MCP: postgres_ro| MCP_DB[Database MCP Server]
    end

    subgraph Context Partition 3: Dev Agent
        Supervisor -->|Handoff: Patch Bug & Test| DevAgent[Developer Agent]
        DevAgent <-->|Scoped MCP: git, filesystem, tests| MCP_Dev[Code Execution MCP Server]
    end

    SREAgent -->|Condensed Synthesis| Supervisor
    DataAgent -->|Condensed Synthesis| Supervisor
    DevAgent -->|PR Link & Test Results| Supervisor

Key Architectural Benefits

  1. Minimized Tool Definition Overhead: Instead of passing 40KB of tool schemas on every turn, each subagent only sees 3 to 5 highly relevant tools.
  2. Context Window Isolation: A 12,000-token database query result generated by the Data Specialist never enters the Developer Agent's context; only the condensed 200-token summary is handed off.
  3. Least Privilege Enclaves: If the SRE Agent is tricked by an indirect prompt injection in a log file, it cannot modify source code or drop database tables because it lacks access to those MCP tools.

2. Context Partitioning & Synthesis Contracts

When transferring execution control between agents, passing the entire raw chat history violates context boundaries. Instead, enforce a strict Handoff Contract:

mermaid
sequenceDiagram
    participant Sup as Supervisor
    participant Data as Data Specialist
    participant MCP as Database MCP Server

    Sup->>Data: Handoff Task: "Audit table accounts for duplicate IDs"
    Note over Data: Context Partition Active (0 tokens history)
    Data->>MCP: tools/call [execute_sql: SELECT ...]
    MCP-->>Data: 8,500 Tokens Raw SQL Rows
    Note over Data: Synthesizes findings internally
    Data-->>Sup: Handoff Return: "Found 2 duplicate rows: IDs 991, 992. Billing impact: $0."
    Note over Sup: Ingests only 45 tokens into main state

JSON Handoff State Schema

json
{
  "origin_agent": "database_specialist",
  "target_agent": "supervisor",
  "task_id": "audit-billing-dup-44",
  "status": "COMPLETED",
  "artifact": {
    "summary": "Identified 2 orphaned duplicate accounts in table 'billing_accounts'.",
    "affected_keys": ["acc_991", "acc_992"],
    "requires_code_patch": true
  },
  "raw_token_expenditure": 9410,
  "compressed_token_payload": 78
}

3. Production Implementation: LangGraph Multi-Agent MCP (Python)

Below is a complete implementation using LangGraph and the official MCP Python SDK, orchestrating a Supervisor and two isolated worker agents:

python
import os
import asyncio
from typing import TypedDict, Annotated, Sequence, List
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, SystemMessage
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, END
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

# 1. State Definition
class MultiAgentState(TypedDict):
    messages: Sequence[BaseMessage]
    next_step: str
    db_findings: str
    sre_findings: str

# 2. Initialize Language Models
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 3. Helper: Execute Scoped MCP Tool
async def run_mcp_tool(server_script: str, tool_name: str, arguments: dict):
    server_params = StdioServerParameters(
        command="python",
        args=[server_script]
    )
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            result = await session.call_tool(tool_name, arguments)
            return result.content[0].text

# 4. Agent Nodes with Scoped Tool Access

async def supervisor_node(state: MultiAgentState):
    system_prompt = SystemMessage(content="""
    You are the Lead Systems Supervisor. Decide which specialist should act next.
    Options:
    - 'data_specialist': To query and inspect database state.
    - 'sre_specialist': To inspect cloud logs and pod status.
    - 'FINISH': When sufficient evidence is collected to conclude the task.
    """)
    messages = [system_prompt] + list(state["messages"])
    response = await llm.ainvoke(messages)
    
    # Route based on LLM response
    choice = "FINISH"
    if "data_specialist" in response.content.lower():
        choice = "data_specialist"
    elif "sre_specialist" in response.content.lower():
        choice = "sre_specialist"

    return {"next_step": choice, "messages": [response]}

async def data_specialist_node(state: MultiAgentState):
    # Context Partition: Specialist only sees its specific instruction
    query = "SELECT count(*) FROM error_events WHERE resolved = false;"
    
    # Invoke Database MCP Server
    mcp_result = await run_mcp_tool("servers/db_mcp.py", "execute_readonly_sql", {"query": query})
    
    # Compress finding before returning to global state
    synthesis = f"Data Audit: Found unresolved errors. Result: {mcp_result.strip()}"
    return {
        "db_findings": synthesis,
        "messages": [AIMessage(content=synthesis)]
    }

async def sre_specialist_node(state: MultiAgentState):
    # Invoke SRE MCP Server
    mcp_result = await run_mcp_tool("servers/sre_mcp.py", "get_pod_health", {"namespace": "prod"})
    
    synthesis = f"SRE Audit: Checked pod health. Status: {mcp_result.strip()}"
    return {
        "sre_findings": synthesis,
        "messages": [AIMessage(content=synthesis)]
    }

# 5. Build StateGraph Workflow
workflow = StateGraph(MultiAgentState)

workflow.add_node("supervisor", supervisor_node)
workflow.add_node("data_specialist", data_specialist_node)
workflow.add_node("sre_specialist", sre_specialist_node)

workflow.set_entry_point("supervisor")

workflow.add_conditional_edges(
    "supervisor",
    lambda state: state["next_step"],
    {
        "data_specialist": "data_specialist",
        "sre_specialist": "sre_specialist",
        "FINISH": END
    }
)

# After workers execute, hand control back to supervisor
workflow.add_edge("data_specialist", "supervisor")
workflow.add_edge("sre_specialist", "supervisor")

app = workflow.compile()

4. JSON-RPC Scoped Tool Registration Payloads

When the orchestrator provisions a subagent session, it uses scoped initialization headers to restrict the tool definitions exposed during tools/list:

Request with Partition Header

http
GET /sse HTTP/1.1
Host: mcp-gateway.internal.enterprise.com
X-Agent-Role: database_specialist
Authorization: Bearer <JWT_DATA_SPECIALIST>

Downstream Filtered tools/list Response

The MCP gateway returns only the subset of tools authorized for the database_specialist:

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      {
        "name": "describe_table_schema",
        "description": "Inspect column names and constraints."
      },
      {
        "name": "execute_readonly_sql",
        "description": "Run read-only analytical queries."
      }
    ]
  }
}

Notice that destructive tools like drop_table or unrelated tools like deploy_helm_chart are completely excluded from the schema manifest.


5. Failure Trapping & Deadlock Prevention

In autonomous multi-agent chains, circular handoffs can occur if Agent A asks Agent B for information, and Agent B delegates back to Agent A.

To prevent infinite execution loops and budget exhaustion:

  1. Max Handoff Counter: Enforce a hard ceiling (e.g., maximum 8 total agent handoffs per user turn).
  2. Duplicate Query Cache: Trap identical tools/call parameters across different subagents using an in-memory hash ring.
  3. Supervisor Override: If a subagent returns an error twice, the supervisor revokes delegation and escalates the issue to a human engineer.

Related Multi-Agent & Orchestration Guides

Ready to Deploy?

Build your full agent toolstack in the Visual Generator

Combine Multi-Agent Tool Orchestration and Context Partitioning with databases, search APIs, and memory graphs in a single configuration file.

Customize in Generator

Multi-Agent Tool Orchestration and Context Partitioning FAQ

What is the Multi-Agent Tool Orchestration and Context Partitioning?

Architecting deterministic multi-agent tool execution with Model Context Protocol (MCP), LangGraph, and CrewAI: Scoped tool partitioning, state isolation, and context compression.

How do I configure Multi-Agent Tool Orchestration and Context Partitioning in Claude Desktop or Cursor?

You can copy the configuration JSON from our guide or launch the interactive MCP Codex Config Generator at https://mcp-codex.com/generator to export valid configs in 1 click.

Can I use Multi-Agent Tool Orchestration and Context Partitioning with the OpenAI Codex CLI?

Yes, OpenAI Codex CLI supports Model Context Protocol. You can add it directly to ~/.codex/config.toml or pass arguments to codex mcp add.

RT

Written by Rad Tome

Lead AI Systems Architect & Founder, MCP Codex

@RadTome

Specializing in Model Context Protocol (MCP) integrations, autonomous AI agent orchestration, and distributed developer toolchains. Researches and benchmarks production MCP client-server architectures across OpenAI Codex, Claude, and Cursor.

Editorial Integrity: All configurations, schemas, and commands verified against live GitHub repositories and tested in local sandbox runtimes.

Related Guides