Target SharePoint environment
SharePoint Online
What SharePoint development model, framework, SDK or API is this about?
💥 SharePoint Framework
Developer environment
None
What browser(s) / client(s) have you tested
Additional environment details
- SharePoint Framework: 1.24.0-beta.3 (SharePoint Copilot Apps / CopilotComponent preview)
- Node.js: v22.22.0
- OS: macOS (Apple Silicon)
- Browser: Google Chrome 151 — the bug is service-side; reproduced in Microsoft 365 Copilot (BizChat) web at m365.cloud.microsoft
- Tenant:
2ef6e6c3-faf4-4a81-ab25-aab96942b9de (Microsoft 365 Developer Program tenant — no admin-center support entitlement, hence filing here)
Describe the bug / error
Since ~2026-08-30 22:00 PT, every SPFx CopilotComponent solution synced to Teams via SyncSolutionToTeams produces a declarative agent whose plugin attaches at the correct version but exposes zero functions. In the BizChat Agent-debug Raw info panel:
"enabledPlugins": [{ "id": "T_<title>.<action>", "version": "<current>", "source": "MOS3" }],
"matchedFunctionCandidates": [],
"functionsSelectedForInvocation": [],
"functionExecutions": []
The model narrates as if invoking but never can. Nothing tenant-visible errors: the SPO catalog reports IsValidAppPackage: true, the solution is deployed tenant-wide, the sync returns 200 {"value":1}, and there is no matching service-health advisory. The packaged mcp_tool_description.tools is verified correct locally in every build.
An agent whose functions were ingested before that time keeps working in the same tenant and surface — so match-time serving is healthy; it is specifically ingestion of new/updated function tables that writes empty.
Isolation matrix (one tenant, 2026-08-30/31)
| App (MOS title) |
Identity |
Plugin content |
Tools |
webApi perms |
Ingest time (PT) |
Functions |
Original (T_7d82a606-ee19-1000-b8cb-d69dade710df) |
unchanged |
previously worked for days |
6 |
2 |
re-syncs 08-30 22:00–23:30 |
empty |
Fresh identity #2 (T_7b1ea0ed-5445-aa91-5c4f-a044aa111e98) |
all-new solution/app/component GUIDs |
same as failing release |
6 |
2 |
08-31 00:15 first sync |
empty |
Fresh identity #3 (T_793ba4db-85bd-fc59-c413-8ea16812075c) |
all-new GUIDs |
byte-identical to last known-working release |
6 |
2 |
08-31 00:45 first sync |
empty |
#3 org-app record deleted + re-synced (T_2c79308c-10cb-0c22-4837-a9888c26de1c) |
fresh org-app record |
known-working bytes |
6 |
2 |
08-31 07:52 |
empty |
Minimal probe (T_af1e5d25-eafd-8806-549d-30de75fa60db) |
all-new GUIDs, new name |
one trivial tool |
1 |
0 |
08-31 08:05 |
empty |
Control: unrelated SPFx Copilot app (T_ce70bbc3-55b0-248c-1941-30dde051e5bc) |
untouched |
untouched |
— |
— |
pre-window |
works |
Identity rotation, content revert, tool count, permission requests, and org-app record recreation were each eliminated. The only predictor of failure is ingest time.
Additional provisioning symptoms in the same window
A first sync of a new solution returned 200 {"value":1} but a re-sync returned 500 "This app couldn’t be added to Teams because it’s blocked in the Teams admin center" — while Teams admin center showed the app Published and Unblocked with no availability assignment (Available to: --, assignments API erroring in the admin UI, app absent from Graph appCatalogs/teamsApps, user install → 403). The record completed provisioning asynchronously ~3–7 h later; its function table remained empty. Reproduced twice.
Traceable request IDs (Agent debug → Raw info)
| When (PT) |
requestId |
| 2026-08-31 ~00:20 |
0646fa4e58e135cb9902ed04916a4460 |
| 2026-08-31 ~07:50 |
d029a77e9e3b6f31a3fbb3b6e4614465 |
| 2026-08-31 ~11:15 |
45f69c748ea5653b3dfb8f9cf65d7fde |
Ask
- Confirm the MOS3-side state of the plugin function tables for the titles above, and why ingestion writes them empty for this tenant since 2026-08-30 ~22:00 PT.
- Advise a supported trigger for re-ingestion once fixed.
- Consider surfacing ingestion failures to tenants — today the only signal is empty
matchedFunctionCandidates in a per-message debug panel, which reads as if whatever you last shipped broke, and cost a five-app bisection to rule ourselves out.
Steps to reproduce
- Build any SPFx solution containing a
CopilotComponent with one or more tools (reproduced with six tools and with a minimal single-tool app).
m365 spo app add … --appCatalogScope tenant → m365 spo app deploy … --skipFeatureDeployment → SyncSolutionToTeams(id=<catalog item>) → returns 200 {"value":1}.
- Acquire the agent in BizChat (agent store, or Graph
POST /users/{upn}/teamwork/installedApps).
- Send any message that should select a tool (e.g. one of the agent’s own conversation starters); open Agent debug → Raw info.
Expected behavior
matchedFunctionCandidates lists the plugin’s functions, the model invokes one, and the CopilotComponent renders inline (this exact flow worked in this tenant for weeks, and still works for the pre-window control agent).
Actual: the plugin attaches at the correct version with an empty function table; the model narrates but can never invoke; no error is surfaced anywhere tenant-visible.
Target SharePoint environment
SharePoint Online
What SharePoint development model, framework, SDK or API is this about?
💥 SharePoint Framework
Developer environment
None
What browser(s) / client(s) have you tested
Additional environment details
2ef6e6c3-faf4-4a81-ab25-aab96942b9de(Microsoft 365 Developer Program tenant — no admin-center support entitlement, hence filing here)Describe the bug / error
Since ~2026-08-30 22:00 PT, every SPFx
CopilotComponentsolution synced to Teams viaSyncSolutionToTeamsproduces a declarative agent whose plugin attaches at the correct version but exposes zero functions. In the BizChat Agent-debug Raw info panel:The model narrates as if invoking but never can. Nothing tenant-visible errors: the SPO catalog reports
IsValidAppPackage: true, the solution is deployed tenant-wide, the sync returns200 {"value":1}, and there is no matching service-health advisory. The packagedmcp_tool_description.toolsis verified correct locally in every build.An agent whose functions were ingested before that time keeps working in the same tenant and surface — so match-time serving is healthy; it is specifically ingestion of new/updated function tables that writes empty.
Isolation matrix (one tenant, 2026-08-30/31)
T_7d82a606-ee19-1000-b8cb-d69dade710df)T_7b1ea0ed-5445-aa91-5c4f-a044aa111e98)T_793ba4db-85bd-fc59-c413-8ea16812075c)T_2c79308c-10cb-0c22-4837-a9888c26de1c)T_af1e5d25-eafd-8806-549d-30de75fa60db)T_ce70bbc3-55b0-248c-1941-30dde051e5bc)Identity rotation, content revert, tool count, permission requests, and org-app record recreation were each eliminated. The only predictor of failure is ingest time.
Additional provisioning symptoms in the same window
A first sync of a new solution returned
200 {"value":1}but a re-sync returned500 "This app couldn’t be added to Teams because it’s blocked in the Teams admin center"— while Teams admin center showed the app Published and Unblocked with no availability assignment (Available to: --, assignments API erroring in the admin UI, app absent from GraphappCatalogs/teamsApps, user install → 403). The record completed provisioning asynchronously ~3–7 h later; its function table remained empty. Reproduced twice.Traceable request IDs (Agent debug → Raw info)
0646fa4e58e135cb9902ed04916a4460d029a77e9e3b6f31a3fbb3b6e461446545f69c748ea5653b3dfb8f9cf65d7fdeAsk
matchedFunctionCandidatesin a per-message debug panel, which reads as if whatever you last shipped broke, and cost a five-app bisection to rule ourselves out.Steps to reproduce
CopilotComponentwith one or moretools(reproduced with six tools and with a minimal single-tool app).m365 spo app add … --appCatalogScope tenant→m365 spo app deploy … --skipFeatureDeployment→SyncSolutionToTeams(id=<catalog item>)→ returns200 {"value":1}.POST /users/{upn}/teamwork/installedApps).Expected behavior
matchedFunctionCandidateslists the plugin’s functions, the model invokes one, and the CopilotComponent renders inline (this exact flow worked in this tenant for weeks, and still works for the pre-window control agent).Actual: the plugin attaches at the correct version with an empty function table; the model narrates but can never invoke; no error is surfaced anywhere tenant-visible.