Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
60c147e
docs: prepare v15 release documentation
flanakin Aug 26, 2026
843a102
docs: add DeploymentScriptACIProvisioningTimeout mitigation
flanakin Aug 26, 2026
44293c2
chore: bump version to 15.0.0
flanakin Sep 2, 2026
327eafb
docs: finalize v15 changelog, what's new blurbs, and hubs docs
flanakin Sep 7, 2026
38a9bbe
Fix PathNotFound error in msexports ETL ingestion on first run (#2247)
flanakin Sep 8, 2026
deb6cb0
Merge origin/dev into flanakin/v15-prep and address notes
flanakin Oct 12, 2026
6e33ed6
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 12, 2026
42484fc
docs: update v15 changelog and what's new blurbs for October
flanakin Oct 14, 2026
aeb0b11
chore: keep marketplace.json versions three-part during version updates
flanakin Oct 14, 2026
4a3c5a6
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 14, 2026
07a5f23
Merge origin/dev into flanakin/v15-prep
flanakin Oct 14, 2026
5a9b60d
fix(power-bi): repoint rate optimization data quality link
flanakin Oct 15, 2026
cfafe27
Merge origin/dev into flanakin/v15-prep
flanakin Oct 15, 2026
5e2fcd6
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 15, 2026
edff142
chore: trigger CI after ms.date bot commit
flanakin Oct 16, 2026
38a071e
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 16, 2026
f1cd3fb
Use semver for plugin.json and add #2247 changelog entry
flanakin Oct 19, 2026
38e6957
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 19, 2026
417790e
Address review: drop percent() code block, simplify eligibility note
flanakin Oct 19, 2026
a172db5
docs: fill v15 changelog gaps (stacked on v15-prep) (#2365)
flanakin Oct 23, 2026
27d1755
Merge dev into v15-prep
flanakin Oct 23, 2026
4f7562a
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 23, 2026
2acd385
Merge remote-tracking branch 'origin/dev' into flanakin/v15-prep
flanakin Oct 23, 2026
2108db2
Merge origin/dev into flanakin/v15-prep
flanakin Oct 26, 2026
bd06cf2
docs: update what's new blurbs for latest v15 changes
flanakin Oct 26, 2026
2175275
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 26, 2026
3e60e4b
docs: add changelog entry for upgrade and data model docs
flanakin Oct 26, 2026
0602e65
Merge origin/dev into flanakin/v15-prep
flanakin Oct 26, 2026
ef9ef58
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 26, 2026
c8a0522
docs: Fix broken ecosystem link in roadmap
flanakin Oct 26, 2026
ecc8226
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 26, 2026
b79a7ef
docs: clean up the v15 changelog and roadmap
flanakin Oct 26, 2026
a460235
docs: address review comments on the roadmap and changelog
flanakin Oct 26, 2026
fa19bd1
docs: restore FinOps toolkit name in changelog entry
flanakin Oct 26, 2026
ca0e272
chore: release prep for v15
flanakin Oct 27, 2026
066cf06
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 27, 2026
f905a22
fix(ci): Register PSGallery before installing Pester in Open Data CI
flanakin Oct 27, 2026
a05990a
chore: add v15 deployment files from packaging
flanakin Oct 28, 2026
ec9862d
chore: Update ms.date in docs-mslearn files
github-actions[bot] Oct 28, 2026
0f3d520
docs: package Power BI from the prep branch and draft the release early
flanakin Oct 28, 2026
56197ee
Clarify version detection changelog wording
flanakin Oct 28, 2026
4a348a9
feat(pbi): default storage reports to 3 months of data
flanakin Oct 28, 2026
ce67cc5
Merge origin/dev into flanakin/v15-prep
flanakin Oct 28, 2026
8a81df1
docs: restore useful v15 changelog detail from dev
flanakin Oct 28, 2026
a276dc3
chore: refresh v15 deployment files after merging dev
flanakin Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 26 additions & 9 deletions .claude/commands/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,18 +152,14 @@ If it fails, show the error and ask whether to investigate or skip.

Power BI packaging reports its own state and saves demo reports with Power BI Desktop, which only runs on Windows.

Demo reports read open data from the `main` branch, so this step must run after the release is merged to main. `/release` doesn't do that merge: the checklist merges to main after the Azure Quickstart Templates review, which can take days. Check whether it has happened:
Package from the release prep branch. Don't wait for the merge to main: the checklist merges to main after the Azure Quickstart Templates review, which can take days. The prep PR stays open until the release is published, so late changes go there. After packaging, commit and push the generated `docs/deploy` files to the prep branch.

```bash
git fetch origin main && git merge-base --is-ancestor HEAD origin/main && echo merged
```

If it prints "merged", continue. If not, skip the rest of this section: tell the user Power BI packaging comes after "Merge to main" in the checklist, leave `release:powerbi` unchecked, add "Package Power BI after the merge to main" to the manual steps below, and offer to run `/release` again once the merge is done.
Package everything, not only the toolkit zips, and delete `release/` first so no files from an earlier release are left behind. Create the draft GitHub release as soon as `Package-Toolkit` finishes (see "Draft the GitHub release" below) so the files are ready while the rest of the checklist closes.

Before packaging, two things have to be done:

1. The demo hub is on this release and has current data, because the demo reports are saved with its data. Run `pwsh -Command "./src/scripts/Deploy-Demo.ps1"` in the background, because it takes 15 to 45 minutes, which is longer than a foreground command can run. It deploys or updates the hub and waits until data is ingested. It fails if the hub still isn't ready after 30 minutes; run it again to keep waiting. Show its warnings verbatim.
2. Someone has signed in to Power BI Desktop on the Windows machine and refreshed one demo project from `release/pbix` by hand, once. That stores the data source credentials and makes the Public sensitivity label available, and the packaging command can't answer a credential prompt. Ask the user to confirm with "done".
1. The demo hub (`ftk-demo` in the FTK Prod subscription, which holds demo resources and isn't real production) is on this release and has current data, because the demo reports are saved with its data. Run `pwsh -Command "./src/scripts/Deploy-Demo.ps1"` in the background, because it takes 15 to 45 minutes, which is longer than a foreground command can run. It deploys or updates the hub and waits until data is ingested. It fails if the hub still isn't ready after 30 minutes; run it again to keep waiting. Show its warnings verbatim.
2. Someone has signed in to Power BI Desktop on the Windows machine and refreshed one demo project from `release/pbix` by hand, once. That stores the data source credentials and makes the Public sensitivity label available (the label is only needed, and only checked, when sensitivity labels are enabled for the tenant), and the packaging command can't answer a credential prompt. Ask the user to confirm with "done".

On Windows, tell the user not to use the mouse or keyboard until it finishes, then run it in the background, because it takes about an hour:

Expand All @@ -175,12 +171,33 @@ On other platforms, tell the user to run `Package-PowerBI.ps1 -Unattended` on a

It takes about an hour (roughly 10 minutes per demo report). If it stops because the reports were built from a test open data URL ("isn't permanent"), rerun it once with `-Build` to rebuild against the main branch; don't use `-Build` otherwise, because it discards reports that are already saved.

Relay its status output verbatim β€” it says exactly which step is next. If a report can't be saved automatically, relay the failed step and screenshot path, tell the user to run `Package-PowerBI.ps1 -Open` and save that project as PBIX (refresh, Save as PBIX in `release/pbix`, sensitivity "Public"), then say "done" so you can rerun the command to validate and package.
Relay its status output verbatim β€” it says exactly which step is next. If a report can't be saved automatically, relay the failed step and screenshot path, tell the user to run `Package-PowerBI.ps1 -Open` and save that project as PBIX (refresh, Save as PBIX in `release/pbix`, sensitivity "Public" if sensitivity labels are enabled), then say "done" so you can rerun the command to validate and package.

If validation fails, show the reported issues verbatim. Each one names the file and the fix; don't guess at causes.

If this step ran, do not proceed until all three files are complete: PowerBI-kql.zip, PowerBI-storage.zip, and PowerBI-demo.zip. On Windows, `Package-PowerBI.ps1 -Status` exits 0 only when they are; check the exit code and relay its text. On another platform, the pasted output from the Windows machine has to show the final "Power BI release files" block. File existence alone is not enough, because files from a previous release can still be in `release/`.

### Draft the GitHub release

A draft is only visible to maintainers and doesn't create the tag, so it is safe to create early. Create it after `Package-Toolkit` finishes and update it again after Power BI packaging.

1. Create the draft with the files in `release/` (files only, not folders). Skip the agent plugin zips (`agent-plugin.zip`, `claude-plugin-*.zip`, `agent-skills-*.zip`) unless something in `docs/` or `docs-mslearn/` links to them, because the plugins install from the marketplace JSON.

```powershell
$files = Get-ChildItem release -File | Where-Object Name -notmatch '^(agent-plugin|claude-plugin|agent-skills)' | ForEach-Object FullName
gh release create v{N} --repo microsoft/finops-toolkit --draft --target main --title "{Mmm yyyy} (v{N})" --notes "DRAFT" @files
```

2. Write the body from the previous release's body (`gh release view v{N-1} --json body --jq .body`) and this version's changelog section:
- **New in {Month yyyy}**: one line per tool for new features, each with the tool emoji and a link to its page (don't link individual features).
- **Updated**: one line per tool for changes and fixes, in the same tool order as the previous release. Keep it to the notable items; don't list every change.
- **Contributors**: code contributors come from `gh api --paginate repos/microsoft/finops-toolkit/compare/v{N-1}...dev --jq '.commits[].author.login'` (drop bots; list `@MSBrett` and `@flanakin` last). Supporters are issue reporters from the milestone (`gh issue list --milestone v{N} --state all --json author`) who aren't contributors, sorted alphabetically. Tell the user these lists miss reviewers and discussion participants, so they need a final review.
- **Footer**: copy the previous footer with the version updated. Keep the blog and download links commented out until the release is published.
3. Set the body with `gh api --method PATCH repos/microsoft/finops-toolkit/releases/{id} -F body=@{file}`. Find `{id}` with `gh api repos/microsoft/finops-toolkit/releases --jq '.[] | select(.draft and .tag_name=="v{N}") | .id'`.
4. After Power BI packaging, upload the remaining files with `gh release upload`. `gh` can't find a draft by its `v{N}` tag, so use the `untagged-…` name from the draft's URL: `gh release upload untagged-{hash} release/PowerBI-demo.zip --repo microsoft/finops-toolkit`.

Don't publish the draft. Publishing creates the tag and is done from the checklist.

### Manual steps reminder

After packaging succeeds, inform the user of remaining manual steps documented in the release checklist issue (include a link):
Expand Down
29 changes: 14 additions & 15 deletions .github/ISSUE_TEMPLATE/-internal-only--release-checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,20 @@ Status icons:
- Build all toolkit templates and resolve any issues: `<root>/src/scripts/Build-Toolkit`
> _This step is optional, but can catch issues earlier. You can also add the `-Build` parameter to the publish command in the next step._
- Ensure all tests pass: `<root>/src/scripts/Test-PowerShell -Unit -Integration`
- [ ] <!-- release:package --> Package all release files (except the Power BI demo reports, which come after the merge to main): `<root>/src/scripts/Package-Toolkit.ps1 -Build -CopyFiles` script
- [ ] <!-- release:package --> Package all release files: `<root>/src/scripts/Package-Toolkit.ps1 -Build -CopyFiles` script
> _Package from the release prep branch; don't wait for the merge to main. Commit and push the generated `docs/deploy` files to the prep branch. To get files ready early, create a draft GitHub release and upload the files from `release/`; add PowerBI-demo.zip when this step finishes._
- [ ] Confirm the data source saved in the Power BI semantic models points at the current demo hub.
- [ ] Make sure the demo hub is on this release and has current data: `<root>/src/scripts/Deploy-Demo.ps1`
- It deploys or updates the hub and waits until data is ingested, so Power BI can be packaged right after.
- [ ] <!-- release:powerbi --> Package Power BI files on Windows: `<root>/src/scripts/Package-PowerBI.ps1 -Unattended`
> _Builds, saves demo PBIX files with Power BI Desktop, validates, and packages. Takes about an hour. Don't use the mouse or keyboard while it runs. If it stops because the reports were built from a test open data URL, rerun once with `-Build`._
>
> _First, sign in to Power BI Desktop and refresh one demo project by hand so the data source credentials are stored and, if your tenant uses sensitivity labels, the "Public" label is available. The "Public" label is only needed when sensitivity labels are enabled. The command can't sign in or answer a credential prompt._
- If a report can't be saved automatically, the command names the step that failed and saves a screenshot. Save that report by hand, then rerun the command:
- Run `Package-PowerBI.ps1 -Open` to open the projects that need to be saved.
- Refresh the report, select **File** > **Save as**, keep the `<root>/release/pbix` folder, change the file type to PBIX, and set the sensitivity to "Public" (only if sensitivity labels are enabled).
> _Queries are already trimmed and the Get started page is already selected. There is nothing else to change._
- [ ] Confirm all 3 files were created: PowerBI-kql.zip, PowerBI-storage.zip, and PowerBI-demo.zip.
- [ ] Check the docs for broken links:
- Create a personal fork of the main repo.
- If you already have one, update it to the latest.
Expand Down Expand Up @@ -188,20 +201,6 @@ Status icons:
- Close the milestone when all issues have been closed or moved.
- [ ] Verify [documentation](https://aka.ms/finops/toolkit) updated correctly.
> _The documentation site may take 5 minutes to update after the merge is committed. If not updated, look at [GitHub actions](https://github.com/microsoft/finops-toolkit/actions/workflows/pages/pages-build-deployment) to see if there are any failures._

> _Demo reports read open data from the `main` branch, so package Power BI after the merge to main above._
- [ ] Confirm the data source saved in the Power BI semantic models points at the current demo hub.
- [ ] Make sure the demo hub is on this release and has current data: `<root>/src/scripts/Deploy-Demo.ps1`
- It deploys or updates the hub and waits until data is ingested, so Power BI can be packaged right after.
- [ ] <!-- release:powerbi --> Package Power BI files on Windows: `<root>/src/scripts/Package-PowerBI.ps1 -Unattended`
> _Builds, saves demo PBIX files with Power BI Desktop, validates, and packages. Takes about an hour. Don't use the mouse or keyboard while it runs. If it stops because the reports were built from a test open data URL, rerun once with `-Build`._
>
> _First, sign in to Power BI Desktop and refresh one demo project by hand so the data source credentials are stored and the "Public" sensitivity label is available. The command can't sign in or answer a credential prompt._
- If a report can't be saved automatically, the command names the step that failed and saves a screenshot. Save that report by hand, then rerun the command:
- Run `Package-PowerBI.ps1 -Open` to open the projects that need to be saved.
- Refresh the report, select **File** > **Save as**, keep the `<root>/release/pbix` folder, change the file type to PBIX, and set the sensitivity to "Public".
> _Queries are already trimmed and the Get started page is already selected. There is nothing else to change._
- [ ] Confirm all 3 files were created: PowerBI-kql.zip, PowerBI-storage.zip, and PowerBI-demo.zip.
- [ ] Tag and publish a [new release](https://github.com/microsoft/finops-toolkit/releases/new):
- [ ] Create a tag on publish using the "vX.X" format.
- [ ] Set the **Target** to `main`.
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/opendata-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ jobs:
# Windows runners.
- name: Install Pester
shell: pwsh
run: Install-Module -Name Pester -MinimumVersion 6.0.0 -Scope CurrentUser -Repository PSGallery -Force
run: |
if (-not (Get-PSRepository -Name PSGallery -ErrorAction SilentlyContinue)) { Register-PSRepository -Default }
Install-Module -Name Pester -MinimumVersion 6.0.0 -Scope CurrentUser -Repository PSGallery -Force
- name: Test Open Data
id: test
shell: pwsh
Expand Down
6 changes: 4 additions & 2 deletions docs-mslearn/TOC.yml
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,8 @@
href: toolkit/optimization-engine/troubleshooting.md
- name: Reference
href: toolkit/optimization-engine/reference.md
- name: Open data
href: toolkit/open-data.md
- name: Agent plugins
href: toolkit/agent-plugin/finops-toolkit-agent-plugin-overview.md
- name: PowerShell
items:
- name: All commands
Expand Down Expand Up @@ -282,6 +282,8 @@
href: toolkit/bicep-registry/modules.md
- name: Scheduled actions
href: toolkit/bicep-registry/scheduled-actions.md
- name: Open data
href: toolkit/open-data.md
- name: Data Lake Storage connectivity
href: toolkit/data-lake-storage-connectivity.md
- name: Help + support
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
title: FinOps toolkit agent plugin overview
description: The FinOps toolkit agent plugin brings AI-powered cloud financial management to Claude Code and GitHub Copilot CLI.
author: MSBrett
ms.author: brettwil
ms.date: 10/28/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-toolkit
ms.reviewer: msbrett
#customer intent: As a FinOps practitioner, I need to learn about the FinOps toolkit agent plugin.
---

# FinOps toolkit agent plugin

The FinOps toolkit agent plugin brings AI-powered cloud financial management to your coding agent. It works with both [Claude Code](https://claude.com/claude-code) and [GitHub Copilot CLI](https://docs.github.com/copilot/how-tos/set-up/install-copilot-cli), pairing role-specific agents, ready-to-run commands, and a FinOps hubs query skill with a read-only [Azure MCP server](https://github.com/Azure/azure-mcp) so you can analyze cost data, review recommendations, and manage FinOps hubs without leaving your terminal.

## Installation

Install the plugin from the FinOps toolkit repository:

```bash
# Claude Code
claude plugin add microsoft/finops-toolkit

# GitHub Copilot CLI
copilot plugin install microsoft/finops-toolkit
```

The plugin registers an Azure MCP server scoped to the Kusto namespace in read-only mode, so it can query FinOps hubs data without being able to modify your environment.

## What's included

### Agents

| Agent | Description |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Chief Financial Officer** | Executive-level guidance across financial strategy, capital allocation, risk management, budgeting, forecasting, and cost optimization. |
| **FinOps practitioner** | Domain expertise on FinOps principles, cost allocation, showback/chargeback models, and the FinOps Framework maturity model. |
| **FinOps hubs database query** | Queries cost data, resource metadata, pricing, regional data, and service mappings from a FinOps hub's Data Explorer database. |
| **FinOps hubs agent** | Deploys, upgrades, configures, and troubleshoots FinOps hubs, including Cost Management exports and hub architecture questions. |
| **Azure capacity manager** | Azure capacity evidence for FinOps work: quota analysis, capacity reservation groups, SKU availability, region and zone access, and coordinating capacity guarantees with pricing commitments. |

### Commands

| Command | Description |
| ----------------------- | -------------------------------------------------------------------------------------------------------------- |
| `/ftk-hubs-connect` | Discover FinOps hub instances via Azure Resource Graph, connect to a cluster, and save environment settings. |
| `/ftk-hubs-healthCheck` | Check a deployed hub's version against the latest stable and dev releases and validate data freshness. |
| `/ftk-mom-report` | Autonomous month-over-month cost analysis with anomaly detection, forecasting, and actionable recommendations. |
| `/ftk-ytd-report` | Comprehensive fiscal year-to-date cost analysis with a forecast through your organization's fiscal year end. |

### Skill and query catalog

The **finops-toolkit** skill triggers on FinOps hubs, KQL, and Azure Data Explorer topics and provides task routing, a query catalog, and schema guidance for working with a FinOps hub's `Costs()`, `Prices()`, `Recommendations()`, and `Transactions()` functions.

## Required permissions

- [Azure CLI](/cli/azure/install-azure-cli) authenticated (`az login`).
- Azure RBAC permissions for the Cost Management APIs you want to query or manage.
- For FinOps hubs queries: Database Viewer access to the hub's Azure Data Explorer cluster.

## Give feedback

Let us know how we're doing with a quick review. We use these reviews to improve and expand FinOps tools and resources.

<!-- prettier-ignore-start -->
> [!div class="nextstepaction"]
> [Give feedback](https://portal.azure.com/#view/HubsExtension/InProductFeedbackBlade/extensionName/FinOpsToolkit/cesQuestion/How%20easy%20or%20hard%20is%20it%20to%20use%20the%20FinOps%20toolkit%20agent%20plugin%3F/cvaQuestion/How%20valuable%20is%20the%20FinOps%20toolkit%20agent%20plugin%3F/surveyId/FTK/bladeName/AgentPlugin/featureName/Overview)
<!-- prettier-ignore-end -->

If you're looking for something specific, vote for an existing or create a new idea. Share ideas with others to get more votes. We focus on ideas with the most votes.

<!-- prettier-ignore-start -->
> [!div class="nextstepaction"]
> [Vote on or suggest ideas](https://github.com/microsoft/finops-toolkit/issues?q=is%3Aissue%20is%3Aopen%20sort%3Areactions-%2B1-desc)
<!-- prettier-ignore-end -->

<br>

## Related content

- [FinOps hubs](../hubs/finops-hubs-overview.md)
- [FinOps hubs data model](../hubs/data-model.md)

<br>
Loading
Loading