Steps to reproduce
Summary:
In a GCC High tenant, a custom LOB bot-based message extension receives composeExtension/query and composeExtension/fetchTask invokes normally, but composeExtension/queryLink is never sent when a registered domain is pasted into the compose box. The identical app package works in a commercial tenant. The /entitlements payload served to the client is identical in both clouds, including the messageHandlers domain registration — so the app definition is being ingested and served correctly in GCCH, but no invoke is issued. In Teams Admin, the 'URL Previews' is enabled on the messaging policy assigned to the test user. Reproduced with multiple domains, including a self-owned domain, on manifest versions 1.14, 1.21 and 1.29. Docs list link unfurling as supported in GCC High.
Steps:
- Register a bot in Azure Bot Service on Azure Government; configure the Teams channel and government endpoints.
- Build an app package whose composeExtensions entry contains botId, one query command, one action command, and a messageHandlers link entry for a domain you control:
"composeExtensions": [{
"botId": "<BOT_ID>",
"commands": [
{ "id": "searchCmd", "type": "query", "context": ["compose", "commandBox"], ... },
{ "id": "actionCmd", "type": "action", "context": ["message"], ... }
],
"messageHandlers": [
{ "type": "link", "value": { "domains": ["<your-domain>"] } }
]
}]
- Upload to the GCCH Teams Admin Center, allow via app permission policy, install for a test user.
- Send a 1:1 message to the bot → bot replies (endpoint reachable).
- Invoke the search command from the compose box → composeExtension/query received.
- Invoke the action command from a message → composeExtension/fetchTask received.
- Paste
https://<your-domain>/<path> into the compose box.
Already ruled out:
- Manifest / app definition — identical package works in commercial.
- Catalog ingestion — the /entitlements payload served to the client is byte-identical between commercial and GCCH, including the messageHandlers domain registration. The app definition is ingested and served correctly in GCCH; no invoke is issued from it.
- Tenant policy — AllowUrlPreviews is enabled on the messaging policy actually assigned to the test user (verified via the user's Policies tab, not just Global).
- Domain matching — reproduced with multiple domains, including self-owned. Exact hosts, no wildcards, no scheme/path in the array.
- Schema version — reproduced on manifest 1.14, 1.21 and 1.29.
- Bot/ME plumbing — query and action commands both fire invokes from the same app, same bot ID.
- App identity — fresh app id GUID; exactly one catalog entry claims the bot ID.
Expected behavior
Step 7 delivers a composeExtension/queryLink invoke to the bot's messaging endpoint.
Actual behavior
No invoke reaches the endpoint. No card, no error, no visible client behavior. Silent no-op. The same step in a commercial tenant with the identical package delivers the invoke normally.
Error details
No response
Steps to reproduce
Summary:
In a GCC High tenant, a custom LOB bot-based message extension receives
composeExtension/queryandcomposeExtension/fetchTaskinvokes normally, butcomposeExtension/queryLinkis never sent when a registered domain is pasted into the compose box. The identical app package works in a commercial tenant. The/entitlementspayload served to the client is identical in both clouds, including the messageHandlers domain registration — so the app definition is being ingested and served correctly in GCCH, but no invoke is issued. In Teams Admin, the 'URL Previews' is enabled on the messaging policy assigned to the test user. Reproduced with multiple domains, including a self-owned domain, on manifest versions 1.14, 1.21 and 1.29. Docs list link unfurling as supported in GCC High.Steps:
https://<your-domain>/<path>into the compose box.Already ruled out:
Expected behavior
Step 7 delivers a composeExtension/queryLink invoke to the bot's messaging endpoint.
Actual behavior
No invoke reaches the endpoint. No card, no error, no visible client behavior. Silent no-op. The same step in a commercial tenant with the identical package delivers the invoke normally.
Error details
No response