# Turn Meeting Transcripts into Action Items with AI: A Step-by-Step Workflow

> Build a Power Automate flow that fetches a Teams meeting transcript, asks Claude to extract action items, and sends them to the organiser for review before anything is assigned.

Source: https://www.epifive.com/blog/ai-meeting-transcripts-action-items-workflow · Published 2026-10-28 · EpiFive

## Key takeaways

- The Teams connector in Power Automate has List meeting transcripts and Get meeting transcript content actions, so a flow can fetch transcripts without custom code.
- Graph transcript access depends on tenant settings, so a 403 with GraphAccessToTranscriptsDisabled means an administrator must allow it.
- Send the transcript to the Claude Messages API from an HTTP action, and ask for a fixed JSON structure so the flow can process the result.
- Treat the AI output as a draft, and email it to the organiser for review rather than creating tasks automatically.
- Check data protection rules before sending transcripts to any external AI service, and send only what you need.

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

```text
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 approval
```

The 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 `-AllowTranscription` on `Set-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 Forbidden` with the `GraphAccessToTranscriptsDisabled` inner-error code.
- **Speaker attribution.** When disabled, you can retrieve transcript content only without speaker information. Requesting `text/vtt` then returns `403 Forbidden` with `SpeakerAttributionNotAllowed`; request the `application/vnd.microsoft.graph.transcript+text` format instead, which you must select with the `Accept` header (it is not supported through the `$format` query 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

1. Add **List meeting transcripts** and pass the Meeting ID from step 1. It returns the transcripts for that meeting.
2. 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.
3. 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:

```text
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:

```json
{
  "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 `system` field 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](https://www.epifive.com/blog/claude-message-batches-api-python-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](https://www.epifive.com/blog/meeting-transcription-whisper-teams-apis), and for a similar human-in-the-loop flow on email, see [Automate Shared Mailbox Triage with Power Automate and AI Prompts](https://www.epifive.com/blog/ai-email-triage-shared-mailbox-power-automate).

## 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

## Frequently asked questions

### Can Power Automate get a Teams meeting transcript?

Yes. The Microsoft Teams connector includes the actions List meeting transcripts and Get meeting transcript content, which take the online meeting ID and the transcript ID. You can also call the Microsoft Graph callTranscript API directly with an HTTP action and an app registration.

### Why does my flow get a 403 error when reading a transcript?

Microsoft Graph returns 403 Forbidden with the GraphAccessToTranscriptsDisabled code when the tenant setting for Graph API access to transcripts is off. It returns SpeakerAttributionNotAllowed if speaker attribution is disabled and you request the text/vtt format. Ask a Teams administrator to review the settings, or request the unattributed format.

### Is it safe to send meeting transcripts to an AI service?

Only if your organisation has approved it. Transcripts can contain personal and confidential information, so check your data protection obligations and the AI provider's terms, send only what is needed, and keep a person in the loop to review the output before anyone acts on it.

### Can AI assign tasks automatically from a transcript?

It can propose them, but the output can miss items, misattribute owners or invent due dates. A safer pattern is to send the proposed list to the meeting organiser for approval, then create tasks only after they confirm.

