SharePoint / SharePoint/sp-dev-docs
SharePoint Copilot Apps: MOS3 ingests an empty plugin function table for every SyncSolutionToTeams (tenant-wide)
@jansenbe is already working on this.
Since Sep 2, 2026.
- Dominant language
- PowerShell
- Stars
- 1.4k
- Forks
- 1.1k
- Avg merge
- 4d 12h
- Merged PRs (30d)
- 12
Description
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
- 💥 Internet Explorer
- 💥 Microsoft Edge
- 💥 Google Chrome
- 💥 FireFox
- 💥 Safari
- mobile (iOS/iPadOS)
- mobile (Android)
- not applicable
- other (enter in the "Additional environment details" area below)
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
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
- Build any SPFx solution containing a
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}.- 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.
Contributor 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.
Assessment
This issue has not been assessed yet.