Repository navigation
Rename FinOps multitool to FinOps Explorer - #2368
Draft
Zac Larsen (z-larsen) wants to merge 180 commits into
Draft
Zac Larsen (z-larsen) wants to merge 180 commits into
Zac Larsen (z-larsen) wants to merge 180 commits into
Conversation
added 30 commits
May 19, 2026 14:08
… GUI Adds the Azure FinOps Multitool as a new PowerShell cmdlet in the FinOps toolkit. The Multitool is a WPF-based GUI that scans an Azure tenant for cost optimization, governance, and FinOps insights including cost trends, orphaned resources, idle VMs, tag hygiene, reservation/savings plan utilization, AHB opportunities, budgets, anomaly alerts, and policy compliance. - Public/Start-FinOpsMultitool.ps1: thin launcher cmdlet with comment-based help - Private/FinOpsMultitool/: full implementation (24 scanner modules, WPF GUI, Power BI template) - Tests/Unit/Start-FinOpsMultitool.Tests.ps1: Pester unit tests Windows-only (requires WPF support).
…info - Add contract-aware cost access warning banner (EA/MCA/CSP) on Overview tab - Add contract-specific billing tab messages when billing access unavailable - Add MG hierarchy unavailable info node in tree view with role guidance - Fix tag cost queries: use TagKey grouping type (not Tag/Dimension) - Add batched TagKey+TagValue query attempt with per-tag fallback - Clear skipSubs between batched and per-tag strategies - Add throttle pacing (2s every 2 queries) to avoid 429s - Add EA/MCA cost access detection in Get-CostData - Add runspace pool for API call parallelization
…mming across all tags
Add 11 FinOps-adjacent agent skills that route through the finops-multitool MCP server: power-bi-finops, cost-allocation, azure-policy-governance, unit-economics, finops-reporting, azure-workbooks-finops, forecasting-budgeting, anomaly-investigation, focus-data-quality, sustainability-carbon, and rate-optimization-portfolio. Add a skill-ecosystem hub table to the finops-multitool skill and include the MCP server, tests, and mcp.json config.
…istory throttle fix, Power BI template Rotate 'Crunching numbers/Fetching numbers/Organizing costs' during 429 backoff in REST and Resource Graph retries. Budget History reuses Cost Trend per-sub monthly data to avoid redundant throttled Cost Management queries. Includes accumulated multitool module updates and the New-PowerBITemplate generator.
…ce modules Adds three new scan modules and wires them into the TUI, MCP server, and module loader: - Get-CarbonMetrics (Sustainability): cloud carbon emissions, MoM change, 12-month trend - Get-UnitEconomics (Cost Analysis): cost per vCPU, per VM, and per GB stored - Get-LegacyResources (Optimization): legacy/retiring SKUs needing modernization Documents the new scans, MCP tools, and FinOps KPI usage examples in the README.
added 6 commits
October 14, 2026 12:12
# Conflicts: # docs-mslearn/toolkit/changelog.md
- Linux lookups: take only the first PATH match for id, stat, dotnet, chmod and mkdir. /bin links to /usr/bin there, so each program was listed twice and the call that used the result failed with "The term '/usr/bin/id /bin/id' is not recognized". - Tests: add a guard that scans the module for unrestricted application lookups, and make the Get-Command fixtures return two matches unless one is requested.
Updates the changelog entry, toolkit overview, GitHub Pages docs, and the TUI's report and summary text. Adds a Windows PowerShell 5.1 guard test for Start-FinOpsExplorer and restores the wrapper's trailing newline.
Renames the skill folder and its plugin link, then updates the name, description, and every reference in the other skills and the docs. Also fixes problems found while checking the skills against the Agent Skills spec, the scan code, and Microsoft Learn: - The idle VM and storage tier examples used P14D and P30D intervals. A metric accepts only the time grains in its metric definition, so those return an error, and az monitor metrics list rejects FULL. The examples now use az rest with interval=FULL, like the scans do. - The forecast example shows the body it needs, a Custom timeframe with date-times. The reservation utilization example shows the reservationSummaries call, with startDate and endDate for billing profile scopes. - The legacy resources query flagged every Standard_LRS resource. It now runs the same checks as the scan, and Basic public IPs and load balancers are described as retired (September 30, 2025). - The Azure OpenAI token queries now use platform metrics for per-deployment counts, because exporting to Log Analytics flattens dimensions, and set --top because filtered queries return 10 series by default. - The tag policy table no longer lists an Audit variant that doesn't exist. Deny-only built-ins get a DoNotEnforce assignment first. - Removes allowed-tools: az pwsh. az and pwsh aren't tool names in the documented syntax of the clients checked. - Notes that az graph query uses the resource-graph extension, adds the PowerShell 7 requirement, points to the bundled Learn doc paths, offers az bicep build when no Bicep MCP server is available, and fixes a table row that broke on literal pipes.
Reports now default to FinOpsToolkit/Explorer/Reports under the user's local application data, not FinOpsToolkit/Multitool/Reports. Reports already in the old folder aren't moved.
microsoft-github-policy-service
Bot
requested review from
Brett Wilson (MSBrett) and
Michael Flanakin (flanakin)
October 22, 2026 13:43
Reservation utilization at billing profile scope now passes startDate and endDate. The Consumption API documents $filter as not applicable to billing profiles, so every other scope keeps $filter. A unit test covers both request shapes, and fails against the old query. The Basic public IP and Basic Load Balancer findings, their header comments, and the sample output in the README now say these SKUs retired in September 2025 instead of that they are retiring.
Brings in the billing profile query and retirement wording fixes from the parent PR (microsoft#2155) so this branch stays stacked on top of it.
The overview and the Start-FinOpsExplorer page said FinOps Explorer also includes a separate Desktop app. That app isn't part of the toolkit, so both pages now describe only the TUI.
Preserve Power BI test triggers and multitool workflow permissions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Resolves the conflict in .github/workflows/dev.yml by keeping both changes: the Power BI trigger paths from dev and the permissions block from this branch.
Brings in the latest dev through microsoft#2155 and keeps the newer ms.date (10/23/2026) in the changelog.
Correct recommendation identity, pagination and scope handling; preserve incomplete and unavailable results. Fix Hub JSON and AI classification, decimal monetary rounding, shared allocation and report guidance with related regression coverage. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Brings in the data-correctness fixes pushed to microsoft#2155 (017d781 and the merge that preserves its history). The one conflict, in the agent skill, keeps the new scan-count wording and the renamed Start-FinOpsExplorer command.
Correct billing ownership, allocation weights, capacity completeness, resource identities, orphan cost aggregation, and effective policy rollup. Preserve explicit data-source routing and documented unsupported paths. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Resolves the two conflicts in docs-mslearn/toolkit: - changelog.md: keeps the FinOps multitool entry under Unreleased. Dev's v15 release prep moved everything else out of Unreleased, so the entry stays out of the v15 section. Takes dev's ms.date (10/28/2026). - finops-toolkit-overview.md: takes dev's ms.date (10/28/2026). The multitool bullet and dev's new bullets are both kept.
Michael Flanakin (flanakin)
left a comment
Collaborator
There was a problem hiding this comment.
🤖 [AI] PR review (rename-only diff vs #2155 branch)
The rename is consistent and the wrapper has forwarding, parameter-parity, and PS 5.1 guard tests. One item:
⚠️ Should fix:ms.dateis10/21/2026in the changeddocs-mslearnfiles. The ms.date workflow doesn't run for fork PRs, so it won't be bumped automatically. Per repo convention, set it to the merge date (MM/DD/YYYY) for everydocs-mslearnfile whose body changed.
added 2 commits
October 29, 2026 09:21
Brings in the current microsoft#2155 head (a445793: financial attribution fixes plus dev through the v15 prep). Five conflicts, all docs and skill text. Each takes the microsoft#2155 wording and keeps the FinOps Explorer names: - changelog.md: keeps the FinOps Explorer entry under Unreleased. Dev's v15 prep moved the rest of Unreleased into v15. - finops-toolkit-overview.md, finops-multitool-commands.md and start-finopsmultitool.md: ms.date takes the microsoft#2155 value. The next commit sets it to today's date. - finops-multitool-commands.md, start-finopsmultitool.md and cost-data-source/SKILL.md: the Kusto text follows microsoft#2155 (FINOPS_HUB_KUSTO_URI only, no automatic discovery), with the renamed product, command and skill names.
The ms.date workflow doesn't run for fork PRs, so the six docs-mslearn articles whose body changed in this PR still carried older dates (10/21 to 10/28). Sets them to today's date, as the repo convention in AGENTS.md requires. The date needs another refresh if this merges on a later day.
microsoft-github-policy-service
Bot
requested a review
from Michael Flanakin (flanakin)
October 29, 2026 20:27
Author
|
Thanks for the review. I set I also merged the current #2155 head (a445793), so the branch no longer conflicts with |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🛠️ Description
Stacked on #2155.
#2155's branch lives in my fork, so this diff also shows its commits. To see only the rename, use this comparison:
z-larsen/finops-toolkit@feature/finops-multitool...feature/finops-explorer-rename
This branch also merges the current #2155 head (
a4457936), which has the latest data-correctness fixes and dev through the v15 prep, so the stack stays in sync and doesn't conflict withdev. The conflicts were in docs and skill text. I kept the #2155 wording and applied the new names.The ms.date workflow doesn't run for fork PRs, so I set
ms.dateto 10/29/2026 on the sixdocs-mslearnarticles this PR changes. I'll refresh it if this merges on a later day.What changed
Start-FinOpsExplorer.Start-FinOpsMultitoolstays as a thin wrapper that forwards every parameter to it.FinOpsToolkit/Explorer/Reportsunder local application data. Reports already in the old folder aren't moved.finops-multitoolagent skill is nowfinops-explorer, in the skills folder and the plugin. The other skills point to the new name.Agent skill fixes
I checked the skills against the Agent Skills spec, the scan code, and Microsoft Learn. Fixed:
P14DandP30Dintervals, which these metrics don't offer. They now useaz restwithinterval=FULL, as the scans do.startDateandendDate).Standard_LRSresource. It now matches the scan, and Basic public IPs and load balancers are described as retired.allowed-tools: az pwsh, which doesn't name tools in the documented syntax.az graphextension and the PowerShell 7 prerequisite.Left alone
/multitoolsite route, so existing links keep working.Invoke-FinOpsMultitool, theFinOpsMultitoolmodule folder and its Parquet cache path, and CI job names.Questions
Start-FinOpsMultitoolhasn't shipped in a toolkit release, so the wrapper only protects people on preview builds. I can drop it and its docs section if you'd rather not carry it..LINK. Theaka.ms/ftk/Start-FinOpsExplorershort link would need to exist first.📋 Checklist
🔬 How did you test this change?
Local, Pester 6.0.0, on this branch after merging the current #2155 head: Lint 7,669 passed. Unit 3,781 passed, 8 skipped, 2 failed. The two failures are
Resource-backed usage allocationtests inMultitoolSafetythat need theAz.OperationalInsightsmodule, which isn't installed on my machine. They pass with that command stubbed.MultitoolPackageintegration 3/3.📦 Deploy to test?
🙋♀️ Do any of the following that apply?
📑 Did you update
docs/changelog.md?📖 Did you update documentation?