A multi-agent client-intelligence demo for corporate and institutional banking, built on Microsoft Copilot Studio, Azure AI Foundry, Power Automate and Dataverse, grounded on the LSEG Data & Analytics MCP server.
A relationship manager types a company name in free text. Six Copilot Studio agents resolve the entity and research it in parallel against live LSEG data. An Azure AI Foundry orchestrator then synthesises the findings into a Bankable Wallet estimate with evidence-traced next best actions.
Unofficial demo. This is a personal technical demonstration. It is not a product, not supported, and not affiliated with or endorsed by London Stock Exchange Group plc or Microsoft Corporation. No LSEG data, content or credentials are included in this repository - you must supply your own licensed connection. Nothing here is investment advice. See Disclaimers.
Free-text entity resolution. No dropdown, no pre-seeded company list, no
GLEIF lookup. Type ADNOC Gas, adnoc gas plc or a misspelling - a
dedicated resolver agent searches LSEG and returns a legal entity with RIC,
PermID, LEI and a confidence score. Below the confidence threshold it returns
ranked candidates for disambiguation rather than guessing.
Fail-closed, never fabricated. Every agent must prove it actually reached
an LSEG MCP tool. If it did not, the run is marked ConnectorUnavailable and
shown in red. Missing data is displayed as an explicit "no data" state - it is
never silently smoothed over into a confident-looking answer.
Fully auditable agent conversations. Every agent panel opens the real transcript for that run: the exact prompt Power Automate sent, the agent's own message activities, and the parsed JSON envelope. None of it is reconstructed in the browser.
Modelled numbers are labelled as modelled. The Bankable Wallet carries a
Modelled chip, exposes its capture-rate band and revenue anchor, and every
driver line references the evidence item it came from.
A relationship manager types free text into the web resource, which writes a row to Dataverse. A Power Automate flow picks it up, resolves the entity, gates on confidence, fans out to five specialists in parallel, and hands their envelopes to an Azure AI Foundry orchestrator for synthesis. Results land back on the run row, which the UI is polling.
Only the Entity Resolver and the five specialist agents talk to LSEG. The orchestrator reasons purely over what those agents already returned - it never queries market data itself.
Full detail, including the fail-closed status matrix and the transparency columns, is in docs/ARCHITECTURE.md.
| Agent | Platform | Responsibility |
|---|---|---|
| Entity Resolver | Copilot Studio | Free text to legal entity: RIC, PermID, LEI, confidence, candidates |
| Fundamentals | Copilot Studio | Revenue, earnings, estimates, capital structure |
| Credit & Risk | Copilot Studio | Issuer credit, spreads, leverage signals |
| Markets & Pricing | Copilot Studio | Instruments, pricing, market context |
| News & Events | Copilot Studio | Corporate actions, announcements, disruptions |
| Macro & Country | Copilot Studio | Sovereign and sector backdrop |
| Orchestrator | Azure AI Foundry (gpt-5.6-sol) |
Synthesis, wallet modelling, next best actions |
src/webresource/hub-v2.html Single-file UI (no build step, no dependencies)
scripts/ Idempotent Python deployment scripts
solution/ Exported Dataverse solution, managed + unmanaged
scripts/export_solution.py Secret-safe solution export
tools/ Diagram generators (Azure OpenAI gpt-image-2)
docs/ARCHITECTURE.md Architecture notes, status matrix, column map
docs/FOUNDRY_SETUP.md Standing up the Azure AI Foundry orchestrator
docs/images/ Architecture and data-flow diagrams
docs/screenshots/ UI screenshots
- A Dataverse environment with Copilot Studio and Power Automate
- Access to the LSEG Data & Analytics MCP server
- An Azure AI Foundry project with a model deployment that supports the Agents
API and strict
json_schemaoutput (gpt-5.6-solorgpt-4.1) - An Entra app registration holding Azure AI Developer and Cognitive Services User on that Foundry resource
Setting those up is walked through in docs/FOUNDRY_SETUP.md.
- Python 3.11+ and the Azure CLI
Download the packages from the
latest release,
or use the copies in solution/:
| File | Use |
|---|---|
lseg_IntelligenceHubV2_2_0_0_0_managed.zip |
Managed - clean install |
lseg_IntelligenceHubV2_2_0_0_0.zip |
Unmanaged - if you want to customise it |
During import you will be prompted for the lseg_FoundryClientSecret
environment variable. The published packages ship with that value blank on
purpose - supply your own. See Security.
export DATAVERSE_URL="https://yourorg.crm.dynamics.com"
export AZURE_TENANT_ID="<tenant-id>"
export FOUNDRY_CLIENT_ID="<app-registration-client-id>"
export LSEG_FOUNDRY_CLIENT_SECRET="<client-secret>"
export FOUNDRY_ACCOUNT="<foundry-resource-name>"
export FOUNDRY_PROJECT="DefaultProject"
export FOUNDRY_MODEL="gpt-5.6-sol"
export FOUNDRY_PROJECT_ENDPOINT="https://<foundry-resource-name>.services.ai.azure.com/api/projects/DefaultProject"
az loginThe Foundry values come from docs/FOUNDRY_SETUP.md. Do that first if you have not already - the orchestrator is the one component the solution zip cannot bring with it.
python scripts/deploy_v2_foundation.py # tables and columns
python scripts/deploy_v2_agents.py # Copilot Studio agents
python scripts/publish_v2_agents.py # publish them
python scripts/deploy_foundry_orchestrator.py # Foundry orchestrator (see FOUNDRY_SETUP.md)
python scripts/deploy_v2_flow.py # orchestration flow
python scripts/deploy_webresource.py # UI
python scripts/deploy_v2_app.py # model-driven appEvery script is idempotent - safe to re-run.
python scripts/test_v2_agents.pyNo secrets are stored in this repository. The Foundry client secret is
held in the Dataverse environment variable lseg_FoundryClientSecret and is
read by the flow at runtime. Tenant, client, org, Foundry resource and model
names are all read from environment variables.
A warning worth repeating. Dataverse's ExportSolution writes environment
variable values into the package, so a raw export of this solution contains
the Foundry client secret in plaintext. Never publish one. Use
scripts/export_solution.py, which exports, blanks every environment variable
value, then re-reads the zip and refuses to finish if any value survived:
python scripts/export_solution.pyThe published release assets were produced this way and re-verified after upload.
For anything beyond a demo, back that environment variable with Azure Key Vault rather than storing the secret in Dataverse directly.
![]() |
![]() |
| Free-text entry | Live agent progress |
![]() |
![]() |
| Modelled wallet and next best actions | Orchestrator synthesis transcript |
Not an official product. This is a personal technical demonstration built to show a Microsoft agent architecture pattern. It is not a Microsoft or LSEG product, it is not supported, it carries no SLA, and it is not affiliated with, sponsored by, or endorsed by London Stock Exchange Group plc or Microsoft Corporation. Views and design choices here are the author's own and do not represent either company.
Trademarks. "LSEG", "Refinitiv", "Datastream", "Microsoft", "Dynamics 365", "Power Platform", "Copilot Studio", "Dataverse" and "Azure" are trademarks of their respective owners. They are used here descriptively to identify the technologies involved. No trademark rights are claimed or granted.
No market data is included. This repository contains no LSEG data, content, entitlements or credentials. Running the demo requires your own licensed LSEG Data & Analytics subscription and MCP connector access, used under your own agreement with LSEG. Screenshots are illustrative only, show point-in-time output for one company, and must not be relied upon or redistributed as market data.
Not investment, financial or credit advice. Nothing produced by this demo - including the Bankable Wallet estimate, risk signals, credit commentary or next best actions - is investment research, a recommendation, a solicitation, or advice of any kind. Do not use any output to make financial, credit, trading or commercial decisions.
The wallet figure is modelled, not reported. The Bankable Wallet applies an
assumed capture-rate band to a revenue anchor drawn from the fundamentals
evidence. It is a synthetic illustration of a modelling technique. It is not a
forecast, not a valuation, and it is not LSEG's or anyone else's estimate of
actual banking revenue. The UI labels it Modelled for that reason.
Generative AI output can be wrong. Every agent in this system is a large language model. Output can be incomplete, out of date, misattributed, or simply incorrect, even when it cites evidence. The fail-closed design reduces the chance of a confident answer built on a failed data call - it does not make the content correct. Always verify against the source before acting.
Not production-ready. The LSEG connector runs in maker mode with a single shared credential, so there is no per-user entitlement enforcement and no per-user audit trail. The Foundry client secret is held in a Dataverse environment variable rather than Key Vault. Neither is appropriate for production use with licensed market data or for handling client information.
Diagrams are AI-generated illustrations. The architecture and data-flow
images in docs/images/ were produced with gpt-image-2 from the prompts in
tools/. They are conceptual and may simplify or omit detail. The
authoritative description is docs/ARCHITECTURE.md and,
ultimately, the code.
Use at your own risk. Provided "as is", without warranty of any kind. See LICENSE.
- The UI is a single self-contained HTML file. There is no build step and no runtime dependencies.
- Every deployment script is idempotent and safe to re-run.
- This is a demonstration asset, not a supported product.
MIT - applies to the code in this repository only.
Market data, the LSEG connector, and Microsoft platform services are governed by their own separate licences and are not granted by this repository.







