feat(MK8S-196): add WebMCP protocol support to shell-ui#4820
Draft
JBWatenbergScality wants to merge 75 commits intodevelopment/132.0from
Draft
feat(MK8S-196): add WebMCP protocol support to shell-ui#4820JBWatenbergScality wants to merge 75 commits intodevelopment/132.0from
JBWatenbergScality wants to merge 75 commits intodevelopment/132.0from
Conversation
…/octopus/w/133.0/improvement/ARTESCA-16560-rspack-bump
…mp/octopus/w/133.0/improvement/bump-core-ui-to-remove-vega
…n-0.21.6' into tmp/octopus/w/133.0/improvement/ARTESCA-16630-bump-module-federation-0.21.6
…33.0/feature/merge-131.0.6-tag
…topus/w/133.0/improvement/MK8S-68-use-smart-cron-trigger
…pus/w/133.0/improvement/bump-core-ui-0.193.0
…33.0/feature/merge-131.0.7-tag
…/133.0/improvement/bump-ui-operator-1.0.13
…/4745/132.0/improvement/bump-ui-operator-1.0.13' into tmp/octopus/q/133.0
…0/feature/merge-131.0.7-tag' into tmp/octopus/q/133.0
…33.0/feature/merge-131.0.8-tag
…ion-0.21.6' and 'development/133.0' into tmp/octopus/w/133.0/improvement/ARTESCA-16630-bump-module-federation-0.21.6
…tmp/octopus/w/133.0/bugfix/ARTESCA-15796-refresh-token-issue
…p/octopus/w/133.0/bugfix/email-template-url-is-incorrect
…p/octopus/w/133.0/bugfix/email-template-url-is-incorrect
…g' into w/133.0/feature/merge-131.0.9-tag
…33.0/feature/merge-132.0.0-alpha.4-tag
… tmp/octopus/w/133.0/improvement/change-ui-dev-configuration-2
…w/133.0/improvement/change-dt-secret
…e' into tmp/octopus/w/133.0/improvement/ARTESCA-16840-exclamation-triangle-to-circle
…/w/133.0/improvement/navbar-style-improvements
…e-to-circle' and 'q/w/4760/132.0/improvement/ARTESCA-16840-exclamation-triangle-to-circle' into tmp/octopus/q/133.0
…/w/4755/132.0/improvement/navbar-style-improvements' into tmp/octopus/q/133.0
This commit adds support for etcd distroless images for Kubernetes 1.33+. Above etcd 3.5.21, etcd images are now distroless and upstreamed to the etcd project. It modifies the backup script to use the correct etcdctl command to snapshot the etcd data instead of using `sh -c` to execute the command in the etcd container. It modifies the remove node action to use the correct etcdctl command to list and remove etcd members and It also enforces the use of `=` for the arguments of etcdctl in the disaster recovery documentation, the remove node action and the backup script. Closes: MK8S-94
…ase 133.0.0 Kubernetes v1.33.7 We pick the last patch version available at date while respecting the major.minor for theses packages etcd 3.5.26 CoreDNS v1.12.4
The previous implementation tried to access the snapshot file from the container rootfs, which fails with distroless etcd images where the root filesystem is read-only. Save the snapshot directly to /var/lib/etcd (writable mounted volume) and retrieve it from the host mount point instead of navigating through containerd runtime paths. This fixes backup failures with etcd 3.5.21+ distroless images.
…w/133.0/feature/merge-132.0.0-tag
MetalK8s 133.0.0-alpha.1 === MetalK8s 133.0.0-alpha.1 embeds Kubernetes 1.33.7. Useful links --- - [Documentation](https://metal-k8s.readthedocs.io/en/133.0.0-alpha.1) - [Upgrade notes](https://metal-k8s.readthedocs.io/en/133.0.0-alpha.1/operation/upgrade.html) - [Changelog](https://github.com/scality/metalk8s/blob/133.0.0-alpha.1/CHANGELOG.md)
…AlertManagerConfig
…e and pin version 1.28.0 The `k8s-sidecar` image will be bump in another PR, surely in the `grafana` one
…topus/w/133.0/bugfix/MK8S-150-wrong-icon-nodes-dashboard
…o tmp/octopus/q/133.0
…w/133.0/feature/merge-132.0.1-tag
We do not use kubectl nor crictl to execute commands in containers, since some commands may restart kube-apiserver and/or containerd and/or kubelet. That's why we use runc directly to execute commands in containers Especially since for `crictl exec` if we lose connection to the containerd socket, the command silently exit with exit code 0, which is really misleading
This salt execution module is not used so let's remove it
…mp/octopus/w/133.0/improvement/MK8S-176-fix-broken-link-in-volumes
…o tmp/octopus/w/133.0/improvement/fix-biomejs-when-run-from-root
…/133.0/improvement/MK8S-178-hide-logs-link
…/4804/132.0/improvement/MK8S-178-hide-logs-link' into tmp/octopus/q/133.0
…nd 'q/w/4805/132.0/improvement/fix-biomejs-when-run-from-root' into tmp/octopus/q/133.0
…3.0/feature/merge-132.0.2-beta.1-tag
…w/133.0/feature/merge-132.0.2-tag
This PR adds the ability to deploy a Service and a ServiceMonitor for solutions operators in order to allow Prometheus to scrape metrics from them.
Before this the solution-next ISO was not used at all, so let's fix it and add a simple test for solution upgrade
Implements the WebMCP standard (navigator.modelContext.registerTool()) so that micro-apps can expose AI-agent tools through their WebFinger configuration. Shell-ui owns the full registration lifecycle. Changes: - ConfigurationProviders: add optional `mcpTools: FederatedModuleInfo` to BuildtimeWebFinger spec so micro-apps can declare their tool module - MCPRegistrar (new): uses ComponentWithFederatedImports to load each micro-app's tool module and calls navigator.modelContext.registerTool() for every tool; wraps authRequired tools with a PKCE auth modal via OidcClient + requestUserInteraction - AuthProvider: expose `userManager` from useAuth(); add `autoSignIn: !isAIUserAgent()` to suppress Keycloak redirect in AI agent sessions (detection via UA pattern matching in mcp/userAgent.ts) - FederatedApp: mount <MCPRegistrar /> alongside SolutionsNavbar - rspack.config.ts: copy @mcp-b/webmcp-local-relay browser assets to build output (embed.js + widget.html); patch widget.html to raise the request timeout from 10 s to 60 s to accommodate STS + SDK round trips; exclude @mcp-b/* from Module Federation shared config Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Contributor
Hello jbwatenbergscality,My role is to assist you with the merge of this Available options
Available commands
Status report is not available. |
Contributor
Request integration branchesWaiting for integration branch creation to be requested by the user. To request integration branches, please comment on this pull request with the following command: Alternatively, the |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements the WebMCP standard so that shell-ui can expose AI-agent tools registered by micro-apps via
navigator.modelContext.registerTool(). Tools are declared in each micro-app's WebFinger spec and loaded by shell-ui through the existing Module Federation infrastructure.ConfigurationProviders– adds optionalmcpTools: FederatedModuleInfofield toBuildtimeWebFinger.spec, parallel to existingnavbarUpdaterComponentssrc/mcp/types.ts– ambientNavigator.modelContexttypes +MCPToolDefinition/ToolContextcontractssrc/mcp/userAgent.ts–isAIUserAgent(): UA-pattern-based detection of known AI agent crawlers (GPTBot, ClaudeBot, Gemini, Perplexity, …) to suppress Keycloak auto-redirectsrc/mcp/MCPRegistrar.tsx– usesComponentWithFederatedImports(same pattern asInstanceName.tsx) to load each micro-app's tool module and callregisterTool()for every exported tool;authRequired: truetools are wrapped with a PKCE auth modal viaOidcClient+requestUserInteractionAuthProvider– exposesuserManagerfromuseAuth(); addsautoSignIn: !isAIUserAgent()so the app loads without redirecting to Keycloak in AI sessionsFederatedApp– mounts<MCPRegistrar />inside thestatus === 'success'block alongsideSolutionsNavbarrspack.config.ts– copies@mcp-b/webmcp-local-relaybrowser assets (embed.js,widget.html) to build output viaCopyRspackPlugin; patcheswidget.htmlto raise the relay request timeout from 10 s → 60 s; excludes@mcp-b/*from Module Federation shared configHow a micro-app declares tools
Add
mcpToolstospecin the app'smicro-app-configurationWebFinger:{ "spec": { "mcpTools": { "module": "./MCPTools", "scope": "my-app" } } }Expose the module in rspack:
The module exports a plain
{ tools: MCPToolDefinition[] }— no React component required.Example: a weather micro-app
An AI agent connected via the WebMCP local relay can then call
getCurrentWeather({ city: "Paris" })orsetLocation({ city: "Tokyo" })directly against the running UI.Test plan
autoSignInremainstrue→ existing Keycloak redirect behaviour unchangednavigator.modelContextauthRequiredtool when unauthenticated shows PKCE modal; cancelling returns{ success: false, error: { code: 'AUTH_REQUIRED' } }NavbarUpdaterComponentsandInstanceNamepatterns unaffected🤖 Generated with Claude Code