← All work
Case study · Enterprise AI · Copilot Studio

Answering insurance RFPs with approved answers, word for word.

An AI agent in Copilot Studio, backed by custom MCP servers, that finds validated answers in seconds and never rewrites the approved wording.

  • Copilot Studio
  • MCP
  • Azure
  • Dataverse
  • SharePoint
Client
A European employee-benefits insurer
Industry
Insurance / Employee Benefits
Our role
End-to-end design, build and operation: architecture, agent design, two custom MCP servers, Azure backend, questionnaire intake pipeline, Power Apps controls, security, telemetry and DEV/UAT/PROD rollout
Status
In production since 2026
Platform
Copilot Studio · Model Context Protocol · Azure · Dataverse · SharePoint · Microsoft 365 Copilot
The challenge

Hundreds of questions. Most answered before. None to be paraphrased.

The same questions, again and again

Bid teams answer long RFP questionnaires from brokers and prospective clients. Most questions (data protection, claims process, pooling, service model) were already answered in earlier bids, but those answers were spread across old proposals, SharePoint libraries and spreadsheets.

Wording is a compliance matter

A validated answer must be reused exactly as approved. An AI that “helpfully” rephrases an approved answer is a compliance risk, not a feature.

The right answer depends on context

The same question can have different correct answers by region, solution type, broker or client. And it all had to work inside Microsoft 365 and Power Platform, under enterprise identity and admin policies.

What we built

A Copilot Studio agent that finds, proves and acts.

RFP Assistant is a Copilot Studio agent backed by two custom MCP servers. Ask it a question and it searches the client's validated answer library in Dataverse: an exact match first, then a semantic search by meaning across the whole library. It then backs the answer up with supporting documents from SharePoint. It works one question at a time, or takes an entire uploaded questionnaire and answers every question in it. Bid teams reach the same agent from Microsoft 365 Copilot, from Teams, and from two places inside the model-driven app.

  1. 01

    Finds the approved answer

    It looks for an exact match first. If there isn't one, it searches the whole validated library semantically, by meaning rather than wording. Exact and near-identical matches come back verbatim, with a link to the source record.

  2. 02

    Respects context

    Results can be scoped by region, solution type, broker and client. If the best match belongs to a different context, the agent says so and offers it as an alternative. It never passes it off as an in-context answer.

  3. 03

    Shows confidence honestly

    Results are banded: verbatim answer, list of candidates, or possibly related. If the semantic index is still warming up, the agent says so instead of claiming “no match found”.

  4. 04

    Adds supporting evidence

    Searches SharePoint RFP libraries through the Microsoft 365 Copilot Retrieval API, permission-aware and on behalf of the user. Every document mentioned is a clickable link.

  5. 05

    Handles other lookups

    A child agent answers factual questions such as a person's bio, a client's account manager or contact details, straight from SharePoint documents.

  6. 06

    Acts, not just answers

    Updates answers, sends a question for review by email from a shared mailbox and marks it “In Review”, extracts questions from uploaded questionnaires, and queries RFP requests by status.

Architecture

One agent, four surfaces, two custom MCP servers.

All secured with Entra ID and observable end to end.

Nearly 40 MCP tools across the two servers, for example:

  • search_rfp_questions
  • get_rfp_question_context
  • get_rfp_requests_by_status
  • update_record
  • extract_document_content
  • process_rfp_questions_in_batches
  • execute_prompt
  • get_document_text
  • validate_answer_sources
Engineering highlights

Production enterprise AI, not a chatbot demo.

Search built for compliance, not creativity

An exact match at database level first, then semantic similarity across the entire validated library, held as an in-memory embedding index. Warm searches take well under a second. Scores are reported per method, never blended into one opaque number, and answers from different records are never merged.

Verbatim answers with clear confidence bands

Exact and near-identical matches return the stored, approved answer word-for-word, with the record ID and a deep link. Close and weak matches are shown as candidates, not answers. Degraded states are reported, never hidden.

Custom MCP servers as the integration layer

Two Model Context Protocol servers give the agent precise, typed tools over enterprise data instead of generic connectors. The same servers work with any MCP-capable client: Copilot Studio, GitHub Copilot, Claude and others.

Security and identity done properly

Entra ID authentication on every MCP endpoint (app roles, assignment-required service principals), managed identity between services, per-user permission-aware document retrieval, Key Vault-backed secrets, and a least-privilege review of the Dataverse app user. Rolled out DEV → UAT → PROD with zero downtime.

Evidence-based architecture decisions

A structured architecture review, fact-checked against Microsoft documentation, tested and rejected replacing the custom search with a native Dataverse knowledge source: native generative answers are non-deterministic and expose no similarity score, which fails the verbatim requirement. The result keeps the deterministic MCP matcher, with native knowledge only as a low-confidence fallback.

One agent, four surfaces

The same agent answers in Microsoft 365 Copilot, in Teams, in a control on the question form, and in a side pane that keeps the conversation as users move between records. The side pane sends the open record's context to the agent as a structured event, so it opens already knowing what the user is looking at.

Operable in production

Agent and server telemetry joined by conversation ID, a 15-tile Azure Workbook (conversations, tool latency and failures, search runs), ready-made KQL queries and an investigation runbook. App settings live in Bicep with per-environment parameter files.

Cost-conscious hosting

Scale-to-zero in development, always-warm in production. This cut the expected monthly hosting cost of the MCP tier from about €91 to about €10.

How it works · a whole questionnaire

Upload a questionnaire. Get it back answered and triaged.

Bid teams don't receive questions one at a time, so the agent isn't the only way in. A questionnaire uploaded on the RFP request form is taken apart, answered question by question against the validated library, and handed back with each answer already marked as validated or draft.

  1. 01

    Upload

    A bid manager uploads the questionnaire they received on a form in the model-driven app. Excel, Word or PDF.

  2. 02

    Extract

    A back-end process reads the file and pulls out every question it contains.

  3. 03

    Create

    Each question becomes a record in the Dataverse library, linked to the RFP request it came from.

  4. 04

    Embed

    Each question goes through the text embedding API in Azure AI Foundry, and the embedding is stored on the record so semantic search can use it from then on.

  5. 05

    Search

    For every question, the process calls the MCP servers for the best answer in the validated library.

  6. 06

    Interpret

    An AI Builder prompt turns each MCP response into the answer to post, with its confidence and its sources.

  7. 07

    Post

    Answers land on the question records as the upload progresses, each with a status and the evidence behind it.

Validated

An exact one-to-one match, or a high-confidence one

The approved answer is attached to the question as it stands. Nothing needs rewriting.

Draft

Anything the search is less certain about

The best answer found is still attached, together with the reason it wasn't validated: out of scope, out of region, or from a different client. The bid manager reviews it rather than hunting for it.

Every answer carries its evidence

  • A link to the question record the answer was taken from.
  • The supporting document sources and their URLs.
  • Enough context for a reviewer to agree or overrule in seconds.

The bid manager then reviews the drafts on the question form itself, with the agent in the side pane to help.

How it works · one question

A bid manager's journey.

  1. 1

    A bid manager opens an RFP question in the model-driven app, or asks the agent in Microsoft 365 Copilot or Teams.

  2. 2

    The side pane greets them with the record's context: question, client, region.

  3. 3

    An exact search runs against the validated library. On a hit, the approved answer comes back verbatim, with alternative versions from other RFPs as numbered options.

  4. 4

    If there is no exact hit, the semantic search returns close matches with their context and confidence.

  5. 5

    Supporting documents from SharePoint are added, permission-aware, each as a clickable link.

  6. 6

    The user picks an option by number, asks for a variant for another region or client, or asks the agent to update the record.

  7. 7

    For review, the agent emails the reviewer from a shared mailbox and moves the question to “In Review”.

Results

In production today.

validated answers indexed
~1,400 validated answers indexed
warm search over the library
< 1 s warm search over the library
surfaces, 1 agent
4 surfaces, 1 agent
environments, one build
3 environments, one build
  • Entra ID authentication enforced on all MCP endpoints in all three environments, with a zero-downtime production rollout.
  • Full validated library indexed: ~1,400 questions, up from an earlier design capped at the newest 500.
  • Conversation-level tracing across agent, tools and servers, on a 15-tile operations dashboard.
  • MCP hosting cost expected to fall from about €91 to about €10 a month through per-environment scaling.
Tech stack

Built on the Microsoft stack, end to end.

  • Microsoft Copilot Studio
  • Model Context Protocol
  • Microsoft 365 Copilot
  • Microsoft 365 Agents SDK
  • Copilot Retrieval API
  • Dataverse
  • Power Apps (model-driven)
  • PCF
  • Power Automate
  • AI Builder
  • SharePoint
  • Microsoft Graph
  • Azure AI Foundry (text embeddings)
  • Azure Container Apps
  • Azure Functions
  • Entra ID / MSAL
  • Managed Identity
  • Key Vault
  • Application Insights
  • Log Analytics / KQL
  • Azure Workbooks
  • Bicep
  • Azure Developer CLI
  • Docker
  • TypeScript
  • Node.js
  • React
  • Fluent UI
What we brought

The skills behind it.

AI agent architecture
Agents with tools, child agents, prompt libraries and deterministic guardrails.
MCP server development
Production MCP servers over enterprise data.
Retrieval and search engineering
Exact matching and semantic retrieval, with embeddings, confidence banding and context scoping.
Microsoft 365 and Power Platform integration
Copilot Studio, Dataverse, PCF, model-driven apps, SharePoint, the Microsoft 365 Copilot channel.
Enterprise identity and security
Entra ID, on-behalf-of, managed identity, app roles, least privilege, tenant agent policies.
Cloud engineering and DevOps
Container Apps, Functions, Bicep/azd, multi-environment release.
Observability and support
Telemetry design, KQL, dashboards, root-cause investigations.
Architecture governance
Evidence-based option analysis, documented decisions, phased roadmaps.

Have knowledge your teams keep re-answering?

We build Copilot agents and MCP integrations that turn your approved content into fast, trustworthy answers inside the Microsoft 365 tools your people already use.