DEV Community

Gabriel Mahia
Gabriel Mahia

Posted on

Building Coordination Infrastructure: What 32 MCP Servers Without a Bus Look Like

Thirty-two MCP servers for Kenya's coordination domains.

Water. Health. Agriculture. Insurance. Land. Education. Transport. Tax. Labor. Market prices.

Each one works. None talks to any other.

This is what 32 isolated tools looks like in practice: a CHW in Kisumu flags a cholera cluster. The water quality system doesn't know. The county procurement system doesn't know. The emergency medicine supply chain doesn't know. The tools that need to respond are all present. The coordination between them doesn't exist.

The architectural problem

The Model Context Protocol ecosystem is growing fast. For most of the world, it's growing in domains that already have coordination infrastructure: calendar apps, email clients, project management tools. These tools coordinate with each other through years of API integrations, webhooks, Zapier connections, and shared data stores.

African coordination domains don't have that legacy. They're being built now, from scratch, on MCP.

That means the coordination layer has to be built at the same time.

What a coordination layer looks like at the MCP level

africa-coord-bus defines a CoordinationEvent — a standard cross-domain signal schema — and an EventBus that routes events to the tools that need to respond.

The routing table is explicit:

Trigger Cascade
water.drought_alert (Warning+) bima-mcp, kilimo-mcp, soko-mcp
water.drought_alert (Alert+) + afya-mcp, county-mcp
health.disease_outbreak (cholera) wapimaji-mcp water quality check
agriculture.price_spike (>30%) afya-mcp food security watch
water.flood_alert afya-mcp waterborne watch, county-mcp

Custom rules take three lines:

from africa_coord_bus import RoutingRule, EventDomain, EventSeverity

bus.routing.add(RoutingRule(
    name="locust→emergency_procurement",
    trigger_domain=EventDomain.AGRICULTURE,
    trigger_event_type="locust_swarm",
    trigger_min_severity=EventSeverity.ALERT,
    target_actions=["fomu-mcp.emergency_procurement", "county-mcp.agriculture_alert"],
))
Enter fullscreen mode Exit fullscreen mode

The composable coordination stack

The pattern that's emerging for East Africa:

Public domain datasets (HuggingFace)
        │ grounding knowledge
        ▼
32 MCP servers (PyPI) ←── africa-coord-bus
        │
        ▼
A2A + ADK agents
        │
        ▼
Streamlit coordination interfaces
Enter fullscreen mode Exit fullscreen mode

Each layer is replaceable. The models are replaceable. The MCP servers are replaceable. What persists is the coordination architecture.

Install

pip install africa-coord-bus
Enter fullscreen mode Exit fullscreen mode

Source: github.com/gabrielmahia/africa-coord-bus

The coordination gap was the last missing layer. It's now installable.

Source: africa-coord-bus on PyPI

Top comments (1)

Collapse
 
mads_hansen_27b33ebfee4c9 profile image
Mads Hansen

The explicit routing table is the right starting point. The next reliability boundary is the event envelope, because a false or duplicated alert can amplify across several public-service systems faster than an isolated tool failure.

I would make every CoordinationEvent carry a stable event ID, schema version, authenticated source, county/tenant scope, observed-at and expires-at times, evidence references, causal parent, and severity provenance. Target actions then need deterministic idempotency keys derived from event + rule + action, plus a record of accepted, rejected, expired, and manually escalated deliveries.

The test I would want most is replay under faults: duplicate, delay, reorder, partially deliver, revoke a routing rule mid-cascade, and verify that the resulting public action is bounded and explainable. A dry-run mode that shows the full proposed cascade before activation would also make new rules much safer to operate.