A multi-agent control plane for IT service management.
A supervisor agent decomposes each request and dispatches scoped specialist agents — Triage, Access-Review, Onboarding — that operate Serval's system of record over the Model Context Protocol. Every agent is a Cloudflare Durable Object. Watch it orchestrate, live.
The orchestration, streaming live
Pick a scenario. The supervisor Durable Object plans, delegates over RPC, and the chosen specialists run their own Claude tool-loops against the Serval MCP backend — every decision and tool call streamed to your browser over Server-Sent Events.
Live runs call Claude through Cloudflare AI Gateway. The backend is a faithful in-Worker mock of Serval (12 tools); flip one env var to point at the real Serval MCP server.
One supervisor, three specialists, a shared system of record
The hard part of a multi-agent system is coordination and context. Here, each agent is an independently-addressable Durable Object, so context isolation is enforced by the runtime — not by prompt discipline. The supervisor holds only references and distilled findings; specialists never leak their transcripts upward.
Deployed on Cloudflare
One Worker · five Durable Objects · Claude via AI Gateway — no servers to manage, scales at the edge.
solid = request path dashed = async / optionalbackend: mock ⇄ live via SERVAL_MODE
System of engagement
A Worker routes /api/run to a Supervisor Durable Object that streams the run back as SSE. Static assets serve this page from the edge.
Tiered models
Opus 4.8 supervises and synthesizes; Sonnet 4.6 and Haiku 4.5 do the specialist work. Strong where it matters, cheap on the leaves.
System of record
The mock Serval backend is a real remote MCP server — point MCP Inspector or Claude Desktop at /mcp and call its 12 tools directly.
The agent registry
Least privilege is real, not cosmetic: each specialist is handed only its slice of the Serval toolset before any tool reaches Claude. A specialist literally cannot see — and therefore cannot call — a tool outside its scope.
Tools marked in red mutate state — they're flagged destructiveHint in MCP and traced on every call.
Everything used to build it
A deliberately current stack — the June-2026 frontier of agents, protocol, and edge platform, with every choice justified.
Agents SDK on Durable Objects
Supervisor + specialists + the MCP backend are all Durable Objects. RPC, SQLite state, hibernation, and edge streaming come for free.
McpAgent backend
The Serval mock speaks the latest MCP — structuredContent results, readOnlyHint/destructiveHint annotations, and isError results the model can recover from.
Claude via AI Gateway
@anthropic-ai/sdk routed through Cloudflare AI Gateway: caching, retries, cost tracking, and reconnect buffering — with a hand-rolled, fully-traced tool loop.
Supervisor / workers
Dynamic decomposition, a 4-field delegation contract, a simplicity gate, cheap routing via Haiku for single-domain requests, and resilient fan-out via getAgentByName() + Promise.allSettled — one specialist failing never kills the run.
Streaming over the edge
The supervisor returns a ReadableStream of trace events — no duration limit on Workers — rendered live in this console.
Typed & tested
Zod contracts at every boundary, pure tool operations unit-tested, scenario routing guarded, and a deterministic access policy with its own suite.
The best practices, and how each is implemented
Thirty researched practices from Anthropic's agent & context-engineering guidance, the MCP spec, OpenAI/LangChain operations, and the Cloudflare platform — every one mapped to a concrete mechanism in the code, not just an aspiration.
A Orchestration
B Context engineering
C Tools & protocol
D Safety & security
E Observability & eval
F Model & platform controls
The safety boundary is code, not a prompt
The headline claim of an agentic ITSM tool is that it grants access safely. We don't trust the model to honor that. The Access-Review agent's decisions pass through a deterministic policy inside the tool itself — so even a jailbroken model cannot approve production or admin access.
// An agent decision can never be more permissive than policy allows. const verdict = decideAccess({ resource, scope, requesterActive, isProduction, isAdmin }); const enforced = RANK[agentDecision] > RANK[verdict.decision]; record(enforced ? verdict.decision : agentDecision); // policy wins, always
How it was built
From a single URL to a deployed multi-agent system — research-first, spec-driven, and verified in the real app.
Deep, fact-checked research
The product, the MCP API, the June-2026 agent & context-engineering frontier, and the Cloudflare platform — adversarially verified, then distilled into a design.
Spec, then re-spec for Cloudflare
A full design spec — re-platformed when the Claude Agent SDK proved incompatible with Workers, onto the Cloudflare Agents SDK, McpAgent, and AI Gateway.
Subagent-driven TDD
A phased plan executed task-by-task with two-stage review — every SDK shape verified against the installed packages, every boundary typed and tested.
Caught in the real app
A live run revealed the MCP client tags tools with a generated connection id, not the server name — silently hiding all 12 tools. Only running it for real surfaced it. Fixed, redeployed, verified.