A profile-driven Declarative Agent for M365 Copilot that automates recurring stakeholder updates by aggregating data from multiple sources — Teams meetings, Slack discussions, Azure DevOps work items, and Loop notes — then outputting a voice-calibrated, structured update to a Loop page.
Built for the monthly Foundation Stakeholder Meeting, but designed to be adaptable to any update purpose, cadence, or audience via swappable profiles, templates, and voice profiles.
User (M365 Copilot Chat)
│
▼
Declarative Agent
│
├─ instruction.txt → Profile-aware workflow, voice calibration, few-shot examples
│
├─ profiles/ → JSON configs per meeting type (cadence, audience, data sources)
│ ├─ foundation-stakeholder.json
│ ├─ weekly-team-sync.json
│ └─ example-profile.json
│
├─ templates/ → Output format templates per profile
│ ├─ foundation-stakeholder.txt
│ ├─ weekly-team-sync.txt
│ └─ example-template.txt
│
├─ voice-profiles/ → Writing style guides (tone, structure, language)
│ ├─ default.txt
│ └─ example-voice.txt
│
└─ plugins/ → MCP data source connectors
├─ workiqPlugin.json → Teams meetings, messages, documents (via WorkIQ)
├─ adoFlowPlugin.json → Work items, sprints, boards (via Azure DevOps)
├─ loopPagesPlugin.json→ Raw notes input + formatted output (via Loop)
└─ slackPlugin.json → Channel discussions, announcements (via Slack)
- You trigger the agent from M365 Copilot Chat: "Generate my monthly update"
- Agent loads profile — determines lookback period, data sources, template, and voice
- Agent reads raw notes from your Loop page (primary grounding context)
- Agent gathers meeting context via WorkIQ (Teams meetings, messages, docs)
- Agent pulls work item status via ADO-Flow (Azure DevOps)
- Agent searches Slack for relevant discussions, decisions, and announcements
- Agent synthesizes everything using your template and voice profile
- Agent writes the formatted update to your output Loop page
- Node.js 18+
- Microsoft 365 Copilot license
- Teams Toolkit VS Code Extension or CLI
- Access to the data sources you want to use (Azure DevOps, Teams, Loop, Slack)
git clone https://github.com/docooley/stakeholder-update-agent.git
cd stakeholder-update-agent
code .cp env/.env.dev.example env/.env.devEdit env/.env.dev and fill in your MCP server URLs and Loop page IDs. See the setup guides for each data source.
Edit or copy a profile in appPackage/profiles/:
- Set your ADO organization, project, and team
- Set your Slack channels and search queries
- Set your Loop page IDs
- Choose your template and voice profile
Open in VS Code → Teams Toolkit sidebar → Provision (select dev environment).
Note: Some organizations block CLI-based auth. See Provisioning Guide for VS Code-based provisioning.
Open M365 Copilot Chat → find "Stakeholder Update" agent → "Generate my monthly update"
- Copy
appPackage/profiles/example-profile.json - Rename it (e.g.,
quarterly-okr-review.json) - Set the
id,name,cadence,audience, andlookbackDays - Configure
dataSources— choose which sources to pull from - Point to your template and voice profile
- Fill in
sourceConfigwith your Slack channels, ADO project, Loop pages, etc.
- Copy
appPackage/templates/example-template.txt - Define the sections your audience expects
- Use placeholder tokens (
{Month},{Workstream Name}, etc.) - Reference it in your profile's
templatefield
- Copy
appPackage/voice-profiles/example-voice.txt - Describe your tone, structure patterns, and language preferences
- Paste 2-3 excerpts from your own past updates as few-shot examples
- Reference it in your profile's
voiceProfilefield
| Path | Description |
|---|---|
appPackage/declarativeAgent.json |
Agent config — name, instructions, plugin references |
appPackage/instruction.txt |
System prompt — profile-aware workflow, voice, few-shot examples |
appPackage/manifest.json |
Teams app manifest |
appPackage/profiles/ |
Profile configs (one per meeting type) |
appPackage/templates/ |
Output format templates |
appPackage/voice-profiles/ |
Writing style guides |
appPackage/plugins/ |
MCP data source plugin manifests |
docs/ |
Setup guides for MCP servers and provisioning |
env/.env.dev.example |
Template environment file |
env/.env.dev |
Your environment variables (gitignored secrets in .env.dev.user) |
teamsapp.yml |
Teams Toolkit lifecycle config |
| Plugin | Source | What It Provides |
|---|---|---|
| WorkIQ | Teams meetings, messages, docs | Meeting decisions, action items, shared documents |
| ADO-Flow | Azure DevOps | Work item status, sprint progress, blockers |
| Loop Pages | Microsoft Loop | Raw notes (input) + formatted update (output) |
| Slack | Slack workspace | Channel discussions, announcements, decisions |
Each data source is optional — configure only the ones relevant to your workflow.
See CONTRIBUTING.md for guidelines on adding profiles, templates, voice profiles, plugins, and documentation.