Skip to content

SharePoint Copilot Apps: MOS3 ingests an empty plugin function table for every SyncSolutionToTeams (tenant-wide) #11017

Description

@dnys1

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

  1. 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.
  2. Advise a supported trigger for re-ingestion once fixed.
  3. 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

  1. Build any SPFx solution containing a CopilotComponent with one or more tools (reproduced with six tools and with a minimal single-tool app).
  2. m365 spo app add … --appCatalogScope tenantm365 spo app deploy … --skipFeatureDeploymentSyncSolutionToTeams(id=<catalog item>) → returns 200 {"value":1}.
  3. Acquire the agent in BizChat (agent store, or Graph POST /users/{upn}/teamwork/installedApps).
  4. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Needs: Author FeedbackAwaiting response from the original poster of the issue. Marked as stale if no activity for 7 days.area:spfx-copilot-appssharepoint-developer-supportsharepoint-developer-supporttype:bug-suspectedSuspected bug (not working as designed/expected). See “type:bug-confirmed” for confirmed bugs.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions