[Bug]: get_pricesheet_status returns "Unknown" although the price sheet is ready (link is in publishedEntity.properties.downloadUrl)
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 72/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- azure
- Domain
- cloud
Research direction
Find the CostManagement implementation of get_pricesheet_status and trace how it parses the operation status response. Check whether it reads publishedEntity.properties.downloadUrl and expiryTime, using the response shape in the issue as the guide. Add coverage for that response shape and confirm the tool returns the link and expiry after completion.
Written by the indexing model from the issue text.
Description
Description
For a Microsoft Partner Agreement billing account, start_pricesheet_download (agreementType MCA_Invoice, invoice scope) is accepted and returns an operationStatusUrl. get_pricesheet_status on that URL never returns the download link: after InProgress it answers Unknown with "no downloadUrl was present in the response" indefinitely.
Reading the same operationStatusUrl directly (same identity, same URL, all query parameters kept) returns HTTP 200 with the link after 60–90 seconds. The link is in publishedEntity.properties.downloadUrl, not in a top-level downloadUrl or properties.downloadUrl. The tool appears to look only at the top level.
Steps to Reproduce
- Identity with Billing account reader on a Microsoft Partner Agreement billing account.
- Call
start_pricesheet_downloadwithagreementType=MCA_Invoiceandscope=/providers/Microsoft.Billing/billingAccounts/<account>/billingProfiles/<profile>/invoices/<invoice>(the invoice's billingProfileId +/invoices/+ invoice name). - The tool answers
Acceptedwith anoperationStatusUrl. - Call
get_pricesheet_statuswith thatoperationStatusUrlevery 60 seconds. - In parallel, GET the same
operationStatusUrldirectly (same token, unchanged URL).
Expected Behavior
get_pricesheet_status returns the download link (and its expiry) once the operation completes, as the direct GET of the same URL does.
Actual Behavior
First poll: {"status":"InProgress","retryAfterSeconds":60,"message":"Pricesheet generation still in progress. Poll again after 60 seconds."}
Every poll after that, for 20+ minutes:
{"status":"Unknown","message":"Operation status=Unknown but no downloadUrl was present in the response."}
Direct GET of the same operationStatusUrl after 60–90 s: HTTP 200, body fields:
locationHeaderUri=null; asyncHeaderUri=null; operationId=null; errorMessage=null;
publishedEntity.id=/providers/Microsoft.CostManagement/billingAccounts//pricesheets/default;
publishedEntity.type=Microsoft.Billing/pricesheets;
publishedEntity.properties.downloadUrl=;
publishedEntity.properties.rawUrls[0]=;
publishedEntity.properties.expiryTime=
VSCode Version
Not used. Claude (claude.ai) custom connector through agentgateway to the hosted ARM MCP; reproduced with direct MCP JSON-RPC calls from PowerShell 7 (no IDE).
ARM MCP Server Version
Hosted endpoint https://mcp.management.azure.com, CostManagement toolset, 10 Nov 2026.
Model Being Used
Claude (Anthropic) via a claude.ai connector; also reproduced without a model (direct MCP calls).
Trace ID
Not returned by these calls.
Logs / Screenshots
Additional Context
- Reproduced with a user identity (Billing account owner) and an app identity (Billing account reader): the direct GET returns the link for both, so permissions are not the issue.
- The operationStatusUrl returned by start_pricesheet_download is identical in path and query parameter names to the Location header from calling the REST API directly (POST .../invoices//providers/Microsoft.CostManagement/pricesheets/default/download, api-version 2023-11-01).
- Reading the URL without its query parameters fails (HTTP 400), so clients can't work around it with get_resource on the bare path.
- Suggested fix: also read publishedEntity.properties.downloadUrl / expiryTime in get_pricesheet_status.
- Dominant language
- No language data
- Stars
- 30
- Forks
- 6
- PR merge metrics
- No merged PRs in 30d
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Azure/Azure-Resource-Manager-MCP
-
bug
Difficulty 3/5 1-2 days Newbie friendliness 56/100
Azure/Azure-Resource-Manager-MCP#29 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 42/100
-
enhancement
Difficulty 5/5 Over a week Newbie friendliness 12/100
Azure/Azure-Resource-Manager-MCP#26 · 1 comment ·
-
bug
Difficulty 4/5 3-5 days Newbie friendliness 48/100
Azure/Azure-Resource-Manager-MCP#25 · 1 comment ·
-
enhancement
Difficulty 5/5 Over a week Newbie friendliness 25/100
All issues in Azure/Azure-Resource-Manager-MCP
Similar issues
-
AWS Backup selections are queried across Regions, causing incomplete protected resource inventoryPossibly taken @jhyyuun claimed this today. Openbug status/needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
prowler-cloud/prowler#13340 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
aws/aws-cdk#39693 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 68/100
ministryofjustice/cloud-optimisation-and-accountability#1240 ·
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
transitmatters/data-ingestion#271 ·
Maintainers usually reply within 1 day