You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Add vMCP MCPServerEntry dynamic mode reconciler
Enable vMCP dynamic mode to watch MCPServerEntry resources at runtime,
automatically adding/removing them as backends without restart.
- Add CABundleData []byte to Backend and BackendTarget for dynamic mode
CA bundle support (fetched from K8s ConfigMaps, not volume-mounted)
- Extend newBackendTransport to accept CA cert bytes alongside file path,
with data taking precedence over path
- Set Backend.Type = BackendTypeEntry in mcpServerEntryToBackend()
- Add fetchCABundleData() to read CA PEM from ConfigMap via CABundleRef
- Extend fetchBackendResource() to try MCPServerEntry as third type
- Add MCPServerEntry watch with groupRef filtering in SetupWithManager()
- Add MCPServerEntry to ExternalAuthConfig change handler
- Add ConfigMap watch for CA bundle changes affecting entry backends
Closes#4659
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Address review feedback on dynamic mode reconciler
- F1: Make CA bundle fetch failure fatal — return nil to exclude backend
when explicitly configured caBundleRef can't be loaded (matches auth
config failure pattern, prevents silent TLS trust degradation)
- F2: Add field index for ConfigMap→MCPServerEntry lookup via
SetupIndexes() — replaces full List+filter with indexed cache query
- F3: Restore source context in CA parse error messages (file path or
"inline data") for operator debuggability
- F4: Add table-driven tests for fetchCABundleData covering all 5 code
paths (nil ref, not found, key missing, default key, explicit key)
- F5: Extract MapAuthConfigToEntries() as exported method with 4 test
cases covering group/auth config matching and filtering
- F6: Update architecture docs (09-operator, 10-virtual-mcp) to document
MCPServerEntry discovery, ConfigMap watching, and field-indexed lookup
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add integration tests for MCPServerEntry reconciler and CA bundle
Integration tests (Ginkgo+envtest) for BackendReconciler MCPServerEntry
lifecycle: creation with matching groupRef adds backend to registry,
mismatched groupRef excludes backend, deletion removes backend, and
registry version increments on events. Unlike MCPServer/MCPRemoteProxy,
MCPServerEntry uses Spec.RemoteURL directly so backends actually appear
in the registry during envtest.
Workload conversion tests verify BackendTypeEntry is set, CA bundle
data is fetched from ConfigMap, missing ConfigMap causes fatal failure
(returns nil), and empty Key defaults to "ca.crt".
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Declares a remote MCP endpoint as a zero-infrastructure catalog entry. Unlike MCPServer and MCPRemoteProxy, MCPServerEntry never creates a Deployment, Service, or Pod. vMCP connects directly to the declared remote URL.
273
+
274
+
**Key fields:**
275
+
-`remoteURL` - URL of the remote MCP server (required)
276
+
-`groupRef` - MCPGroup membership for discovery by VirtualMCPServer
277
+
-`externalAuthConfigRef` - Token exchange for remote service authentication
278
+
-`caBundleRef` - Reference to a ConfigMap containing CA certificate data for TLS verification
279
+
280
+
The MCPServerEntry controller is validation-only: it validates that referenced resources (groupRef, externalAuthConfigRef, caBundleRef ConfigMap) exist and updates status conditions accordingly. It never probes the remote URL or creates infrastructure.
281
+
282
+
MCPServerEntry backends are discovered by vMCP in both static mode (listed at startup) and dynamic mode (watched by the BackendReconciler). In dynamic mode, ConfigMap changes trigger re-reconciliation of affected MCPServerEntry backends via a field-indexed watch on `spec.caBundleRef.configMapRef.name`.
Copy file name to clipboardExpand all lines: docs/arch/10-virtual-mcp-architecture.md
+7-1Lines changed: 7 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -41,6 +41,7 @@ graph TB
41
41
B1[MCPServer]
42
42
B2[MCPServer]
43
43
B3[MCPRemoteProxy]
44
+
B4[MCPServerEntry]
44
45
end
45
46
46
47
Client[MCP Client] --> Server
@@ -54,9 +55,11 @@ graph TB
54
55
BackendClient --> B1
55
56
BackendClient --> B2
56
57
BackendClient --> B3
58
+
BackendClient --> B4
57
59
Health --> B1
58
60
Health --> B2
59
61
Health --> B3
62
+
Health --> B4
60
63
61
64
style Server fill:#90caf9
62
65
style Aggregator fill:#81c784
@@ -85,17 +88,20 @@ graph LR
85
88
Group -->|contains| S1[MCPServer]
86
89
Group -->|contains| S2[MCPServer]
87
90
Group -->|contains| R1[MCPRemoteProxy]
91
+
Group -->|contains| E1[MCPServerEntry]
88
92
89
93
style vMCP fill:#90caf9
90
94
style Group fill:#ba68c8
91
95
```
92
96
93
97
**Discovery process:**
94
98
1. VirtualMCPServer references an MCPGroup by name
95
-
2. All MCPServersand MCPRemoteProxies in that group are discovered
99
+
2. All MCPServers, MCPRemoteProxies, and MCPServerEntries in that group are discovered
96
100
3. For each backend, URL, transport type, and auth config are extracted
97
101
4. vMCP queries each backend for available tools, resources, and prompts
98
102
103
+
MCPServerEntry backends connect directly to remote MCP servers without deploying a proxy pod. They are zero-infrastructure catalog entries that declare a remote endpoint URL, optional external auth, and an optional CA bundle for TLS verification. CA bundle data is fetched from Kubernetes ConfigMaps at discovery time. In dynamic mode, the BackendReconciler watches ConfigMap changes and uses a field index on `spec.caBundleRef.configMapRef.name` to efficiently re-reconcile only the MCPServerEntry backends affected by a given ConfigMap update.
0 commit comments