Technical details

How the Microsoft Programs Assistant works

It works in Microsoft Teams. An AI model reads the question and calls one of three read-only tools on our MCP server, which reads Microsoft Partner Center. Every fact comes from tested code, so the same question gets the same facts every time.

// .vscode/mcp.json
{
  "servers": {
    "microsoft-programs-assistant-demo": {
      "type": "http",
      "url": "<DEMO-URL>",
      "headers": { "x-api-key": "<TEST-KEY>" }
    }
  }
}
curl <DEMO-URL> \
  -H "x-api-key: <TEST-KEY>" \
  -H "content-type: application/json" \
  -H "accept: application/json, text/event-stream" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call",
       "params": {"name": "portfolio_insights", "arguments": {"product": "Intune"}}}'
# pip install "mcp>=2.3"
import asyncio

import httpx2
from mcp.client import Client
from mcp.client.streamable_http import streamable_http_client

URL = "<DEMO-URL>"
KEY = "<TEST-KEY>"


async def main():
    http = httpx2.AsyncClient(headers={"x-api-key": KEY})
    async with Client(streamable_http_client(URL, http_client=http)) as client:
        result = await client.call_tool("portfolio_insights", {"product": "Intune"})
        print(result.content[0].text)


asyncio.run(main())

At a glance

Runs in
Microsoft Teams, as a Copilot Studio agent
Who can use it
MDS staff we invite, signed in with Microsoft Entra ID
AI model
Claude, provided by Microsoft in Copilot Studio. The live demo uses Claude on Microsoft Foundry
Tools
3 tools on our MCP server, all read-only
Data
Microsoft Partner Center: the incentive catalog, our claims per client, and payment statements
Hosting
Azure App Service, run by MDS

How it answers a question

  1. A person asks in Teams, signed in with Microsoft Entra ID. The agent’s AI model reads the question.
  2. The model picks a tool by its name and description, and calls it on our MCP server. MCP (Model Context Protocol) is an open standard that lets an AI model call tools on a server.
  3. The tool reads Microsoft Partner Center, applies our business rules, and returns facts and warnings. The model writes the answer from them and keeps every warning.

The AI model never decides a fact or a number. Those come from code that has unit tests. The model only picks the tool and words the answer.

Architecture

Copilot StudioMicrosoft runs it · MDS sets it upOur MCP serverAzure App Service · MDS runs itMicrosoft servicesidentity and partner dataasks in Teamstool callHTTPS + API keycalls the toolapplyfetchdatatokenfactsClientan invited userMicrosoft Entra IDusers sign in firstMicrosoft Teamsor Microsoft 365 CopilotAgent · ClaudeMicrosoft-provided modelinstructions shape the wordingMCP toolsends the inputs and an API keyTool resultfacts and warnings, as writtenAnsweradvisor style · keeps the warningsRead-only by designno tool sends, claims or changes anythingthe website demo runs this code on made-up data/mcp endpointchecks the API keyToolslist_programs · customer_incentives ·portfolio_insightsBusiness rulesdecide every factunit-testedPartner Center clientsigns in as the appMicrosoft Entra IDtoken for the appMicrosoft Partner CenterM365 Partner APIcatalog, claimsand statementsPortal only · for peopleeligibility, enrollment, payouts123456
Figure 1. Who runs what. Steps 1–6 follow one question. Microsoft runs Copilot Studio and its own services. MDS runs the MCP server. Dashed: what only people see, in the Partner Center portal.
Microsoft cloudAgent · Copilot StudioTool looprepeats while neededAzure App ServiceApp Service planOur MCP serverMDS runs it · HTTPS onlyMicrosoft servicesMicrosoft Partner CenterHTTPSFactsapplyfetchcalls the tooltokendataClientinvited userMicrosoft Entra IDusers sign in firstMicrosoft Teamsor Microsoft 365 CopilotThe agentClaudeMicrosoft-provided modelMCP toolsends an API keyRead the tool resultfacts and warningsAnsweradvisor style · keeps warningsRead-only by designno tool sends, claims or changes anythingMCP endpoint /mcpchecks the API keyToolslist_programs · customer_incentivesportfolio_insightsBusiness rulesunit-testedPartner Center clientsigns in as the appMicrosoft Entra IDtoken for the appM365 Partner APIthe app reads the catalog,claims and statementsPortal only · for peopleeligibility, enrollment, payouts12asks in Teams3Tool call456Answer
Figure 2. The same question, end to end. The agent can call tools more than once, in a loop, before it answers.
Agent Board websiteAzure Static Web Apps · anyone can visitOur demo serverAzure App Service · MDS runs itMicrosoft servicesthe AI model, and the real dataasksHTTPSquestion, toolsanswercalls a toolreadsVisitorany browser, no sign-inTry Demo pagesends the question as text/chat endpointdaily limits · our website only · holds the model keyDemo agentthe real agent’s instructions, for a made-up partnerToolsthe real agent’s coderead-onlyTest datagenerated, made upTrey ResearchClaudeMicrosoft Foundrypicks the tool, writes the answerMicrosoft Partner Centerno connection from the demo1234
Figure 3. The live demo. Steps 1–4 follow one question. The demo server runs the real agent’s code on made-up test data, and Claude on Microsoft Foundry picks the tool and writes the answer. The demo has no connection to Partner Center. The icons in all three figures are Microsoft’s official architecture icons.

Tools

Three tools, each with one job. Each one is marked read-only, and the server has no tool that sends, claims or changes anything.

ToolAsk itInputsWhat it returnsLimits
list_programs“Which programs pay on Copilot?”NoneEvery program in Microsoft’s incentive catalog, with the products it pays onThe catalog doesn’t show which programs we’re enrolled in
customer_incentives“What can we still claim at Northwind Traders?”customer: a name or tenant ID. Or products: a prospect’s products, separated by commasThe products we haven’t claimed yet at that client, and the one to offer nextWhen several clients match, it lists them, and the agent asks which one
portfolio_insights“Who should we take Intune to?”product, optionalWithout a product: the biggest gaps across all clients. With one: the clients without a claim for it, most other claims firstEligibility isn’t in the data, so every answer says to check it in Partner Center

Test it yourself

Both ways use our demo server. It runs the same code and tools on made-up data for Trey Research, a made-up partner. No real client data is on it.

In your browser

Ask the live demo your own questions. A real AI agent picks the tool and writes the answer.

Try Demo

With your own MCP client

We send you the demo server’s address and a test key. Put them in place of <DEMO-URL> and <TEST-KEY> in the samples at the top of this page. Any MCP client that can send a header works, for example VS Code.

Ask for a test key

Ask the questions it was made for

You askWho should we take Intune to?

The model callsportfolio_insights {"product": "Intune"}

The tool returnsIntune: Trey Research has claimed it at 21 of 32 customers.
Customers without a Trey Research claim for it, most other Trey Research claims first (11 in all): Tailwind Traders (11), Adventure Works Cycles (9), Margie's Travel (7), Fabrikam, Inc. (5), Lamna Healthcare Company (5)
Eligibility isn't in the data. Check it in Partner Center before you contact the customer.

The model then writes a short answer from this text, and keeps the warning.

In TeamsDemo server
Code, tools and rulesOursThe same
DataMicrosoft Partner CenterMade up, for Trey Research
Who can use itMDS staff we invite, signed inAnyone, in the live demo. With your own client: anyone with a test key
AI modelClaude, in Copilot StudioClaude on Microsoft Foundry in the live demo, or the model in your MCP client
KeyPrivateA test key from us

Limits

Want one for your team?

Tell us how your team works today, and we’ll show you what this assistant could do.