You can turn a Microsoft Teams meeting transcript into a reviewable list of action items with a Power Automate flow that fetches the transcript, sends it to an AI model such as Claude through the Messages API, and emails the proposed list to the meeting organiser. The organiser confirms or edits it before anything is assigned. This guide builds that flow step by step, with the permissions, tenant settings and limits that most often block it.
It is written for Microsoft 365 administrators and automation builders who already have Teams transcription turned on and want follow-ups to stop depending on someone taking notes. You will finish with a working flow, a prompt that returns structured output, and a review step that keeps a person responsible for the result. Details were checked against Microsoft Learn and Anthropic documentation on 28 October 2026.
How the workflow fits together
Teams meeting ends -> transcript stored
|
Power Automate: get meeting ID -> list transcripts -> get transcript content
|
HTTP action: Claude Messages API -> JSON list of action items
|
Email or Teams message to organiser for review -> tasks created only after approvalThe flow has four stages: obtain the transcript, ask the model, validate the result, and route it for human approval. The sections below take each in turn.
Prerequisites
- Transcription must be on. In the Teams admin center, go to Meetings > Meeting policies, select the policy, and make sure Transcription is On (it is on by default for new policies). Transcription is both a per-organiser and per-user setting, and the organiser and the person who starts it need it enabled. In PowerShell the parameter is
-AllowTranscriptiononSet-CsTeamsMeetingPolicy. - Someone must start transcription in the meeting. If recording is on but transcription is off, no transcript file is stored.
- Power Automate access to the Microsoft Teams connector. The connector lists actions for meeting transcripts, including List meeting transcripts (input: Meeting ID) and Get meeting transcript content (inputs: Meeting ID and Transcript ID, returns a string).
- An Anthropic API key stored securely, for example in an environment variable or a key vault, not typed into a flow step as plain text. Using the HTTP action may require a Power Automate licence that includes premium connectors; check your plan.
- Approval from your data protection owner. Transcripts often include personal or commercial information. Confirm your organisation permits sending them to the AI provider, and read the provider's data handling terms.
Tenant settings that affect transcript access through Graph
The Microsoft Graph documentation for callTranscript describes two tenant administrator settings, configured in the Teams admin center or with Set-CsTeamsMeetingConfiguration:
- Graph API access to transcripts. When disabled, all transcript requests return
403 Forbiddenwith theGraphAccessToTranscriptsDisabledinner-error code. - Speaker attribution. When disabled, you can retrieve transcript content only without speaker information. Requesting
text/vttthen returns403 ForbiddenwithSpeakerAttributionNotAllowed; request theapplication/vnd.microsoft.graph.transcript+textformat instead, which you must select with theAcceptheader (it is not supported through the$formatquery parameter).
The documentation states these controls take effect from the end of July 2026. If your flow worked before and now returns 403, check them first. For the permissions model when you call Graph directly, delegated access uses OnlineMeetingTranscript.Read.All, and application access requires OnlineMeetingTranscript.Read.All or OnlineMeetingTranscript.Read.Chat plus, for application permissions, an application access policy created by a tenant administrator. The API works only for meetings that have not expired and does not support meetings created with the create onlineMeeting API that are not linked to a calendar event.
Step 1: Start the flow and get the meeting ID
The Teams connector page lists no trigger for a transcript becoming available, so start with a trigger you control. Two common choices:
- A manual (instant) flow that asks for the meeting join URL, useful for a first test.
- A scheduled flow that runs after working hours and processes meetings you identify from calendar events.
Add the Teams action Get an online meeting. It retrieves a meeting by meeting ID, join web URL or join meeting ID, and returns the online meeting you need for the next steps.
Step 2: List and fetch the transcript
- Add List meeting transcripts and pass the Meeting ID from step 1. It returns the transcripts for that meeting.
- Add Get meeting transcript content with the Meeting ID and the Transcript ID of the transcript you want. If a meeting has several, decide a rule, such as taking the most recent.
- Run the flow against a short test meeting and open the run history to confirm the output is a string containing timestamped lines.
When you call Graph directly instead, the transcript content endpoint is under /users/{user-id}/onlineMeetings/{meeting-id}/transcripts/{transcript-id}/content, and the default format text/vtt returns WebVTT with timestamps and <v Speaker> voice tags. Speaker tags help the model assign owners, so keep them where your tenant allows.
Step 3: Build the request to Claude
Add an HTTP action. The Messages API requires the x-api-key header, an anthropic-version header (the documentation examples use 2023-06-01), and a JSON body with model, max_tokens and messages.
Raw transcript text contains quotes and line breaks that break a hand-written JSON body, so build the message object with an expression. First add a Compose action named Message with this expression, where Get_meeting_transcript_content is the name of your step 2 action:
addProperty(json('{"role":"user"}'), 'content', concat('Transcript: ', outputs('Get_meeting_transcript_content')))Here addProperty adds a property to a JSON object and json() converts a string to an object, both standard workflow expression functions. Then set the HTTP action:
| Setting | Value |
|---|---|
| Method | POST |
| URI | https://api.anthropic.com/v1/messages |
| Headers | x-api-key: your key; anthropic-version: 2023-06-01; content-type: application/json |
Body:
{
"model": "claude-sonnet-5-5",
"max_tokens": 1500,
"system": "You extract action items from meeting transcripts. Use only what is stated. Return JSON only: {\"items\":[{\"task\":\"\",\"owner\":\"\",\"due\":\"\",\"evidence\":\"\"}]}. Use an empty string when the owner or due date is not stated. Do not guess.",
"messages": [ @{outputs('Message')} ]
}Check the model ID in Anthropic's models documentation before you deploy, because model names are retired over time. The evidence field asks for the supporting sentence from the transcript, which makes the reviewer's job faster.
Prompt rules that improve reliability
- Tell the model to use only what is stated and to leave owner and due date blank otherwise. Invented owners and deadlines are the most damaging failure.
- Ask for a fixed JSON shape so the flow can parse it with a Parse JSON action.
- Keep the instructions in the
systemfield and the transcript in the user message. - For very long meetings, check the transcript length against the model's context window and the flow limits below before you send it.
Step 4: Parse the result and validate it
The response's content array holds blocks such as {"type": "text", "text": "..."}. Add Parse JSON on the HTTP body, then another Parse JSON on the text of the first content block, using a schema that matches the items structure.
Add a Condition after parsing. If parsing fails or items is empty, send a short message to the organiser saying no action items were found and attach the transcript link instead of failing silently. Use the action's Configure run after setting to catch a failed parse.
Step 5: Send the draft for review
Add Send an email (V2) or a Teams message to the organiser. Format the items as a list and include a clear statement that the list was generated by AI from the transcript and needs checking. Include the evidence text. Only after the organiser replies or approves should another flow, or a later stage of this one, create tasks in Planner, To Do or your ticketing system. A Power Automate Approvals action is a natural fit if you want a recorded approval.
This review step is not optional decoration. Models can omit items, merge two tasks, or assign an action to the wrong person when several people share a name.
Limits to design around
The Power Automate limits page lists these relevant values:
| Limit | Value |
|---|---|
| Outbound synchronous request (such as an HTTP action) | 120 seconds |
| Message size | 100 MB (1 GB with chunking where supported) |
| Run duration | 30 days; pending steps time out after this |
A long transcript sent to a model can take a while to process. If the HTTP action times out at 120 seconds, shorten the input, summarise in sections, or use an asynchronous pattern. The Message Batches API is another option for non-urgent work; see Claude Message Batches API in Python: A Practical Guide for how it works.
Troubleshooting
| Symptom | Likely cause and fix |
|---|---|
| No transcript found for the meeting | Transcription was not started, the organiser's policy has Transcription off, or the meeting expired. Check the meeting policy and run the Teams transcript diagnostic in the Microsoft 365 admin center. |
403 Forbidden with GraphAccessToTranscriptsDisabled | The tenant setting for Graph API access to transcripts is off. A Teams administrator must enable it. |
403 Forbidden with SpeakerAttributionNotAllowed | Speaker attribution is disabled. Request application/vnd.microsoft.graph.transcript+text instead of text/vtt. |
| HTTP action returns 401 | The API key is missing or wrong in the x-api-key header. |
| Parse JSON fails | The model returned text around the JSON. Tighten the prompt, or handle the failure branch and send the raw text to the reviewer. |
| Flow times out | The call exceeded the 120-second outbound request limit. Shorten the input or split the work. |
Alternatives and related reading
If your organisation has Microsoft 365 Copilot licences, the Teams connector also offers List AI insights and Get AI insight, which return meeting summary notes and action items generated by Teams. That route avoids sending transcripts to an external provider but requires the Copilot licence. For a comparison of transcription sources, see Meeting Transcription Options Compared: Whisper, Teams and Cloud APIs, and for a similar human-in-the-loop flow on email, see Automate Shared Mailbox Triage with Power Automate and AI Prompts.
Checklist
- Transcription policy on, and the meeting was actually transcribed.
- Tenant settings for Graph transcript access reviewed.
- API key stored securely; data protection approval documented.
- Prompt forbids guessing owners and due dates.
- Failure branch tells the organiser when parsing fails.
- Tasks are created only after human approval.
References
- Microsoft Learn, manage transcription and captions for Teams meetings: https://learn.microsoft.com/en-us/microsoftteams/meeting-transcription-captions
- Microsoft Learn, Get callTranscript (Microsoft Graph): https://learn.microsoft.com/en-us/graph/api/calltranscript-get
- Microsoft Learn, Microsoft Teams connector reference: https://learn.microsoft.com/en-us/connectors/teams/
- Microsoft Learn, Power Automate limits and configuration: https://learn.microsoft.com/en-us/power-automate/limits-and-config
- Microsoft Learn, workflow expression functions reference: https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference
- Anthropic, Messages API reference: https://platform.claude.com/docs/en/api/messages
Comments
Questions and tips are welcome. Comments are checked by the EpiFive team before they appear; please do not share passwords, phone numbers or other private details.