Case Study · Grounded Multi-Agent AI

From AI proof-of-concept to a bank-deployable assistant.

A B2B wealth-planning platform had an AI demo users loved — and none of the architecture, permissions, or governance that regulated banking partners require. We re-engineered it into a grounded, explainable, multi-agent financial assistant, without rebuilding the engine that already worked.

WealthTech · B2B SaaS
North America
Regulated banking environment
Milestone 1 delivered · live in production

Published with the engagement anonymised at the client's request — a confidentiality bar we treat as part of the deliverable.

As-built · verifiedby the delivery team
0
Independently deployable services
0
Agents — 1 orchestrator + 5 specialists
0
MCP tools over Streamable HTTP
0
Acceptance user stories, Given/When/Then
The client

A growth-stage fintech whose B2B SaaS platform puts a “virtual family office” in the hands of investment advisors and wealth managers — and, increasingly, banks. Identity withheld at the client’s request.

The challenge

A conversational-AI proof of concept that proved demand but couldn’t survive contact with a regulated buyer — inconsistent answers, no permission model, no infrastructure, no audit trail.

The build

A three-service, multi-agent assistant grounded in the platform’s own planning engine via MCP — explainable answers, safe conversational writes, watertight RBAC, streamed in real time.

Status & scope

In production — five planning scenarios live, five more scoped, ahead of wider banking-partner rollout.

01
The client

A virtual family office, in software.

The client is a growth-stage financial-technology company in North America. Its B2B SaaS platform gives investment advisors, wealth managers, and financial professionals the kind of sophisticated wealth-planning tooling that was once the preserve of the ultra-wealthy — founded by experts in tax, law, and financial planning with a mission to democratize access to those strategies.

Day to day, the platform models a client’s entire financial life and projects it forward: retirement readiness, debt payoff, spending capacity, net worth, real-estate decisions, life-expectancy assumptions, and market-performance scenarios. Advisors build a base plan and alternative scenarios, adjust assumptions through toggles and sliders, and re-plan live to show clients the impact of a decision.

The platform optimises for three things: advisor productivity, trust and explainability — answers an advisor can stand behind and repeat to a client — and enterprise readiness, the compliance and security bar that lets it sell into regulated banks. That third one is where this story begins.

Retirement readiness
Debt payoff
Spending capacity
Net worth projection
Real-estate decisions
Life-expectancy modelling
Market-variance scenarios

One product, two very different users

The structural fact that shapes everything — especially access control.
The advisor
  • Works across many clients
  • Builds base & recommended plans
  • Adjusts assumptions, re-plans, explains
  • Needs speed and defensible answers
The end client
  • Sees only their own plan
  • Explores scenarios shared with them
  • Clones safely to experiment
  • Needs clarity, not jargon
Two roles, shared scenarios, zero tolerance for a leak — every AI interaction must know exactly who is asking, about whom, and about which scenario.
02
The challenge

The demo was compelling.
The gap to a product was architectural.

The client had already built an AI proof of concept that let users ask natural-language questions — “when will I be debt-free?”, “can I afford this?” — and get conversational answers from its planning engine. It proved real demand. It was also, deliberately, a demo: a few predefined scenarios, and none of what a regulated deployment requires.

Not built for production

Intentionally narrow, with no architecture for enterprise deployment. Extending it to a broader audience meant a complete rebuild — the shortfalls were structural, not cosmetic.

Inconsistent, unexplainable answers

Without a structured generation approach, outputs varied and couldn’t be justified. In a compliance-sensitive setting, an answer no one can explain is a liability, not a feature.

No multi-role permission model

Advisors and end clients have fundamentally different access rights — and the PoC had no reliable way to enforce those boundaries across shared and cloned scenarios.

No deployment infrastructure

No automated pipelines, no separate dev / test / prod environments, no monitoring. Reliable iteration — the basic rhythm of a production product — was impossible.

Governance & compliance gaps

Banking partners require audit trails, data-protection controls, and exportable records. None existed — which blocked enterprise deployment entirely, on its own.

No observability

No trace of which data produced which answer, no latency or error visibility, no cost lens. You cannot operate — or defend — an AI system you cannot see into.

Why it mattered

The gap between a compelling demo and a deployable product was the direct blocker to the client’s growth strategy — expanding into regulated banking environments. In that context, an assistant that gives inconsistent or unexplainable answers isn’t merely a product weakness; it’s a liability. The client could show promise, but couldn’t sell the capability to the banking partners it was targeting.

03
The mandate

Three non-negotiables, fixed before a line of code.

Focaloid engaged as the client’s AI engineering partner with a clear brief: enable a secure, scalable deployment with a financial partner. The constraints below weren’t aspirations to grow into — they were set as hard requirements before development began.

Non-negotiable · 01

Accuracy

Every figure computed by the platform’s real planning engine — never estimated from the model’s general knowledge. Deterministic, repeatable, correct.

Non-negotiable · 02

Explainability

Every answer traceable to the tools that produced it and the scenario it describes — something an advisor can stand behind and a bank can audit.

Non-negotiable · 03

Security

Role-based access on every call, no cross-client exposure, PII minimised in logs, every write confirmed, idempotent, and exportable for audit.

The decision that shaped everything: modernise the AI layer, keep the engine. The client’s financial-planning logic and APIs already worked — years of domain expertise encoded in a calculation engine advisors trusted. The mandate was to build a modern LLM architecture around that engine, not to replace it. No rebuild of what already worked.

A gated, four-phase path from PoC to deployable
P1

Discovery & requirements formalization

Mapped the existing PoC, user workflows, permission requirements, and compliance needs. Output: a formal BRD with 31 Given/When/Then acceptance stories.

P2

Architecture & AI design

Designed the multi-agent system, access-control model, and compliance framework — with accuracy, explainability, and security fixed as constraints.

P3

Core build

The production assistant across the planning scenarios: advisor and client permission workflows, conversational plan adjustments, safe write controls.

P4

Compliance, observability & deployment readiness

Audit logging, data-protection controls, monitoring, automated pipelines — validated for regulated deployment, with the enterprise roadmap defined.

Scope discipline as a safety feature. Phase I was deliberately bounded to the platform’s financial-insights workspace: no chat beyond it, no direct profile edits, no ungrounded advice, and external bank / payroll / tax integrations explicitly deferred to Phase II. In a regulated build, what the system refuses to do is part of the design.

04
The solution

Static dashboards became a conversation you can trust.

Embedded in the platform’s financial-insights workspace, the assistant lets an advisor or client ask financial questions in plain language and get accurate, explainable answers grounded in the client’s real plan — and safely make what-if changes by conversation, seeing the projected impact before anything is applied.

Scenario coverage — real questions advisors field every week
Delivered in Milestone 1
Scoped next
When can I retire?
What happens if I retire today?
Summarize my plan
How much more can I spend in retirement?
What if markets perform worse?
How long until I’m debt-free?
Pay off my debts five years earlier
Can I plan a $10,000 vacation?
What if I downsize my home?
What if we both live to 100?

Watch a question become a grounded, auditable answer.

The simulation on the right replays the delivered experience: a two-stage flow where the system first selects and runs the right tools against the platform’s real engine, then narrates the verified results — never inventing a number.

  • Live “thinking” you can see. Tool executions stream to the UI as they happen — transparency that builds trust in a domain that runs on it.
  • Answers cite their context. Every response references the scenario and time horizon it describes, and flags any missing assumptions.
  • Writes are previewed, confirmed, reversible. A change proposal shows before/after values and projected impact; nothing touches the plan until the user confirms.
  • Every step logged. Idempotent writes keyed by request ID, exportable audit trails, full traces — the answer and its provenance, together.
AI assistant · financial-insights workspace · scenario: Base
↻ replay

Illustrative conversation with representative data — in the delivered product every figure is computed live by the platform’s planning engine.

05
Architecture

Not a chatbot wrapper. Three services, engineered to fail independently.

The assistant is three independently deployable Python services with deliberately separated jobs: the agent reasons, the MCP server provides safe structured access to the platform's data, and the history service manages state. Each scales, deploys, and fails on its own — in a production financial tool, one slow component must never take down the rest.

RBAC & scoped JWTs on every hop
Client platform
Platform frontend Web app · chat UI — subscribes to a per-scenario event channel over WebSocket
Client platform
Platform backend Authenticates the user, forwards a delegation token, invokes the agent's managed endpoint
AI Companion Agent
LangGraph + DeepAgents · Python 3.12
Orchestrator agent reads the question, routes it — nothing else
Claude Sonnet 4.5
↓ routes to one of five specialists
Retirement analyzersimulations & goals
Sonnet 4.5
What-if scenariotoggles & life events
Sonnet 4.5
Summarizerplan digests
Haiku
Debt analyzerpayoff paths
Haiku
Market analyzervariance / stress
Haiku
Service 2 of 3
MCP Tool Server — FastMCP Exposes the platform's REST APIs as 12 structured, callable tools with a consistent response envelope
retirement
what-if toggles
debt
market variance
life expectancy
plan summary
Source of truth
Platform REST API — the existing planning engine Income · investments · expenses · debts · goals — the same engine advisors already trust, untouched
Service 3 of 3
History & Presence FastAPI — conversation history, presence, execution locks, feedback capture
State
PostgreSQL 16 + DynamoDB Conversation checkpoints, usage & feedback · presence and TTL-based execution locks
Observability
Langfuse Self-hosted LLM tracing — every reasoning path, tool call, and token cost visible

The return path is live. AWS AppSync Events stream the agent's work back to the frontend over WebSocket — stream_start → tool_start → tool_end → tokens → done — so users watch the assistant check their retirement goal in real time instead of staring at a spinner.

Trace IDs & evals on every run
Synchronous request
Real-time streaming
Existing client systems — retained, not rebuilt

The as-delivered system — redrawn from the engagement's architecture documentation, anonymised.

The life of a question, end to end

STEP 01

A message is sent

A user asks a question in the chat UI. The platform backend invokes the AI Companion via its Bedrock AgentCore Runtime endpoint — secure, serverless, session-isolated.

STEP 02

Scope is established

The agent mints a short-lived session token carrying user, client, and scenario identifiers, then connects to the MCP Tool Server with it.

STEP 03

The orchestrator routes

A single-purpose orchestrator classifies the question and hands it to the right specialist — retirement, debt, market variance, what-if, or summary.

STEP 04

Real math runs

The specialist calls one or more MCP tools, which call the platform's live REST APIs — pulling real plan data and running the actual calculation.

STEP 05

The answer streams

The response streams back through AppSync as it's generated — tool status first, then tokens — so the user sees the work, live.

STEP 06

State persists

History, presence, and feedback persist via the History service — the conversation resumes exactly where it left off, on any device.

STEP 07

Everything is traced

The full reasoning path lands in Langfuse with per-turn token cost — a quality lens and a cost lens from day one.

THE RESULT

Grounded, not guessed

Every answer is a live recalculation of the client's actual financial plan — scoped, logged, and recoverable at every step in the chain.

06
Inside the build

The five decisions that made it trustworthy.

Any team can wire a model to an API. The engineering that makes an AI system bank-deployable lives in a handful of deliberate choices — each one below is as-built, not aspiration.

Decision A — Orchestration

Five specialists over one generalist prompt.

A single generalist agent handling retirement math, debt payoff, market stress-testing, and summarisation in one prompt tends to blur its reasoning across domains — and pick the wrong tool. So the orchestrator's only job is to read the question and route it; five narrowly-scoped sub-agents each own their tools and their prompt.

Models are tiered to the work: Claude Sonnet 4.5 runs the orchestrator and the two complex-reasoning specialists (retirement, what-if); Claude Haiku runs the contained, single-purpose lookups — materially better latency and cost with no accuracy loss where it matters. Optional AWS Bedrock routing supports enterprise model-hosting requirements.

"When can I retire?"
"What if I downsize my home?"
"Summarize my plan"
"How long until I'm debt-free?"
"What if markets drop?"
Orchestratorclassify · route
retirement-analyzer
SONNET 4.5
what-if-scenario
SONNET 4.5
summarizer
HAIKU
debt-analyzer
HAIKU
market-analyzer
HAIKU
The core AI risk isn't code bugs — it's the agent choosing the wrong calculation for a question. So tool-selection got its own dedicated evaluation harness: an automated question bank that verifies the agent picks the correct tool, run as a first-class test discipline alongside unit and integration tests across all three services.
Decision B — Safe exploration

Simulate, then revert: what-if answers that never touch the plan.

"What if I retire today?" deserves an answer computed by the real retirement model — but it must not corrupt the client's live plan. Several tools follow a deliberate three-beat pattern:

1

Apply, temporarily

The tool changes the scenario parameter — retirement age, a toggle — inside the platform's engine.

2

Read the real result

The recalculated projection is read back from the engine — the same math the advisor's dashboard runs.

3

Revert — untouched

The change is rolled back. The user has a real answer; the plan is exactly as it was.

Exploration stays non-destructive by design. The user gets an answer computed by the platform's actual model — not a language model's guess — without permanently altering their financial plan. When they do want the change kept, that's a different, explicit path: the confirmed-write flow below.

Decision C — Guardrails

Boring, load-bearing guardrails in the agent layer.

CAP · 15

Tool-repeat cap

A default limit of 15 tool calls per request prevents runaway loops where an agent gets stuck retrying a tool — cost and latency stay bounded, always.

PRE-LLM

Message filters

Regex checks catch obviously out-of-scope or purely conversational messages before they ever reach the LLM — saving cost and latency on traffic that needs neither.

MIDDLEWARE

Passive interrupts

Watches tool responses for UI-relevant signals — a slider value the frontend should update — and threads them into conversation state without the agent handling UI logic.

Decision D — Transparency

Users watch the AI work — by design.

Financial scenario calculations can take a few seconds. Rather than a silent wait, the agent publishes a sequence of typed events as it works, batched up to five per publish and signed with AWS SigV4. The frontend subscribes to a per-scenario channel, so each user only ever receives their own conversation's events.

stream_start
the run begins
tool_start
"checking your retirement goal…"
tool_end
engine result returned
token × n
the answer streams in
done
persisted to history

In a trust-sensitive domain, "the agent is now running your variance analysis" beats a spinner — users see how an answer was reached while it's being reached. It also makes a compelling live demo: the system visibly thinking with real tools, not theatre.

Decision E — Safe writes

Conversational changes with a contract: preview, confirm, re-plan.

Letting users change toggles and retirement sliders by chat risks unintended, irreversible changes to a financial projection. Every conversational write follows the same six-beat contract — and unsupported, unsafe, or permission-violating actions are refused with an explanation, not attempted.

01

Propose

The assistant proposes the change with explicit before / after values.

02

Preview impact

The projected effect on the plan is shown before anything happens.

03

Confirm

Nothing is applied until the user explicitly says yes.

04

Apply, once

Idempotent writes keyed by request ID — a double-send can't apply twice.

05

Re-plan

The scenario recalculates through the platform's engine.

06

Explain the delta

The assistant narrates exactly what changed — and it's all in the audit trail.

07
Security & governance

Scoping enforced structurally — not by convention.

Every layer of the system is scoped to exactly the data a request is authorized to touch. The AI agent can never accidentally pull or act on a different client's financial plan, because the boundary isn't a prompt instruction — it's the token architecture.

Hop 1

Platform backend

Forwards a delegation token alongside each message — the user's authority, delegated to the agent.

Hop 2

Agent mints a session JWT

Short-lived (15-minute) token carrying the user, client, and scenario identifiers. Nothing broader.

Hop 3

MCP server verifies

The JWT rides as a bearer token on every tool call — no token, no tool, no exceptions.

Hop 4

Credentials resolve per client

The MCP server resolves the correct API credentials for that specific client's data — and only that client's.

User
Selected client
Selected scenario

Chat context is always bounded to this triple. Every conversation thread is namespaced by it, every checkpoint keyed by it, every tool call scoped to it. A cross-client leak isn't caught by review — it's structurally unrepresentable.

Refusals are part of the product.

When a client asks the assistant to edit an advisor's read-only scenario, the system doesn't error, and it certainly doesn't comply. It politely declines, explains why, and offers the safe alternative — cloning the scenario to experiment freely. In a regulated build, a well-designed "no" is a feature with a UX.

RBAC on every API call
Trace IDs + latency & error dashboards
Exportable audit trails for all writes
PII minimised in logs
Idempotent writes · request_id
Write-confirmation UX
08
Infrastructure evolution

Then we deleted the Kubernetes cluster.

The first production architecture was proven and conventional: both services on AWS EKS, an SQS FIFO queue between the platform and the agent, CircleCI stitching it together. It worked — and it carried the full operational weight of Kubernetes. Mid-engagement, the client asked about Amazon Bedrock AgentCore. We researched the trade-offs and migrated both services — an architecture decision made on evidence, not inertia.

Before — EKS + SQS era

Owned and operated by hand

  • EKS cluster management, node provisioning, replica sets — for both services
  • Deployment manifests across QA, staging, and production
  • Secrets management and custom JWT middleware
  • A CircleCI pipeline to stitch it all together
  • SQS FIFO queue: visibility timeouts, ordering, a long-polling consumer loop
  • Nodes kept warm around the clock, whatever the traffic

Zero code changes to reasoning, tools, or the MCP protocol — only the deployment target moved.

After — Amazon Bedrock AgentCore

Two serverless endpoints

  • Agent and MCP server as independently invocable managed endpoints
  • Direct HTTP invocation — the queue, timeouts, and polling loop simply gone
  • Automatic, independent scaling per service — MCP spikes scale MCP alone
  • Session-isolated microVMs; up to 8-hour runs for multi-step simulations
  • IAM-verified platform-layer security; VPC & PrivateLink ready
  • Per-second consumption pricing — idle costs approach zero
AspectBefore — EKS + SQSAfter — AgentCore
AI agent & MCP hostingKubernetes cluster (AWS EKS)AgentCore Runtime — serverless endpoints
Message deliverySQS FIFO + long-polling loopDirect endpoint invocation
ScalingManual replica configuration per serviceAutomatic, independent per service
Deployment pipelineCircleCI → ECR → EKS manifestsAgentCore SDK / CLI deploy
SecurityK8s secrets + custom JWT middlewareIAM-verified platform-layer controls
Execution locking & session namespacingCustom DynamoDB locks + scenario namespacesUnchanged — carried over intact
Infrastructure managementClusters, nodes, manifests, namespacesZero — fully managed
PostgreSQL 16

LangGraph conversation checkpoints, token-usage records for cost tracking, and user feedback.

Why: relational, durable, and exactly the structured checkpoint format LangGraph needs — conversations resume across sessions and devices.

DynamoDB

Active-user presence per scenario (10-minute TTL) and execution locks with a 5-minute crash-safety expiry.

Why: high-frequency, low-latency, TTL-driven lookups — the exact shape DynamoDB is best at. Two open tabs can't double-process a message.

Langfuse (Redis · ClickHouse · MinIO)

Self-hosted LLM tracing and observability, plus a custom per-turn usage callback priced against a cache-aware cost table.

Why: a quality lens and a cost lens from day one — isolated from core application data. Local dev runs the whole stack via Docker Compose + LocalStack, no cloud required.

09
Outcomes

What shipped, and what it changes.

We separate two kinds of claims — deliberately. The build facts below are as-delivered and verified by the engineering team. The impact figures are the joint delivery team's projections, and stay labelled that way until live production usage data confirms them. Buyers in regulated industries appreciate the difference; so do we.

✓ As-built · verified

The delivered system, in countable facts

0
Independently deployable services — agent, MCP server, history & presence
0
Agents — 1 orchestrator + 5 domain specialists on tiered models
0
MCP tools calling the platform's real REST APIs
0+5
Scenarios live in production, five more scoped
0
Kubernetes deployments retired — plus the queue and the CI pipeline
~70%

Less manual effort to move from PoC to production-ready deployment — weeks, not months, to regulated-deployment readiness.

~80%

Faster releases with three fully automated environments and deployment pipelines replacing hand-run processes.

Faster readiness for enterprise banking-partner deployment versus the original proof of concept.

~70%

Less time digging through dashboards — advisors answer client questions conversationally instead of re-reading charts.

~80%

Less advisor–client back-and-forth to explain projections and plan changes — the assistant explains as it answers.

~40%

Faster client onboarding driven by AI-guided interactions — plus ~50% smoother advisor workflows overall.

Projected impact, estimated by the joint delivery team and reviewed by engineering — pending measurement against live production usage. The product is now in production; we publish measured figures only once they exist. Build and scope facts above are as-delivered.

Before — the proof of conceptAfter — the production assistant
Narrow, predefined scenarios; couldn't extend without a rebuild10+ planning use cases in one conversational interface — modular and extensible
Inconsistent, unexplainable answersDeterministic, explainable, data-grounded answers via MCP and a select-then-narrate flow
No multi-role permissionsRBAC on every call; cross-role and cross-client exposure structurally impossible
No environments, pipelines, or monitoringAutomated environments and CI/CD — later simplified further onto serverless AgentCore
No audit, data-protection, or governance controlsAudit trails, data-protection controls, exportable records, full observability
A promising demo — not deployable to banksDeployment-ready for regulated banking partners

It is rare to see an external team develop such a strong understanding of both the business requirements and the underlying technical architecture in such a short period of time.

CEO
Chief Executive OfficerB2B wealth-planning platform, North America · shared anonymised at the client's request

A level of ownership that feels much more like an extension of our internal team than a traditional vendor relationship.

CEO
Chief Executive OfficerFrom an unsolicited appreciation note during delivery — on the researched MCP and AgentCore recommendations
10
What's next

Built for Phase II before Phase I shipped.

The architecture decisions above weren't just about this release. The modular service split, the MCP contract, and the serverless runtime were chosen so the platform can scale to enterprise deployment without another rebuild.

Phase II — defined in the engagement

The enterprise roadmap

  • Multi-institution rollout across banks and retirement-account providers — multi-tenant controls and institution-level governance.
  • Broader financial scenarios and richer advisor- and client-facing insights — five further scenarios already scoped.
  • External integrations — banking, payroll, and tax engines, deliberately deferred from Phase I's bounded scope.
  • Measured outcomes — live production usage data to convert today's projections into verified, client-confirmed results.
The reusable pattern

This generalises.

Grounded multi-agent orchestration over MCP, a select-then-narrate flow, simulate-then-revert exploration, and contract-based conversational writes — the pattern transfers to any regulated, data-grounded assistant: banking, insurance, healthcare, anywhere an answer must be right, explainable, and auditable.

BFSI
WealthTech
Insurance
Healthcare
Any system of record

The stack, end to end

LangGraph
DeepAgents
Claude Sonnet 4.5 + Haiku
AWS Bedrock (optional)
FastMCP · langchain-mcp-adapters
Python 3.12 · FastAPI
AWS AppSync Events
Bedrock AgentCore Runtime
PostgreSQL 16
DynamoDB
Langfuse
Docker · Compose · LocalStack
Alembic
Let's build

Have an AI proof-of-concept that needs to become a product?

We take AI experiments to bank-deployable — explainable, permission-safe, auditable — without rebuilding what already works. Governed at every gate, shipped at AI speed.