Skip to content

Commit 49ce724

Browse files
JAORMXclaudejhrozekdanbarr
authored
Add Virtual MCP Server documentation (#326)
* Add Virtual MCP Server documentation skeleton Add documentation structure for the new Virtual MCP Server feature that aggregates multiple MCP servers into a single unified endpoint. New guides (docs/toolhive/guides-vmcp/): - index.mdx: Landing page - intro.mdx: Introduction and use cases - quickstart.mdx: Getting started with VirtualMCPServer CRD - configuration.mdx: CRD configuration reference - tool-aggregation.mdx: Conflict resolution strategies - authentication.mdx: Two-boundary auth model - composite-tools.mdx: Multi-step workflows New concept page: - concepts/vmcp-architecture.mdx: Architecture overview New tutorial: - tutorials/quickstart-vmcp.mdx: End-to-end tutorial The documentation contains placeholder TODOs for detailed examples and manifests to be filled in. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Address PR feedback for Virtual MCP documentation Changes based on review feedback: - Fix "VS Code" to "Visual Studio Code" on first use (style guide) - Fix link text to match page title in intro.mdx - Remove redundant guides-vmcp/quickstart.mdx (duplicates tutorial) - Update sidebars.ts to remove quickstart from guides section - Rewrite concepts/vmcp-architecture.mdx to be user-focused: - Explain "why" vMCP exists and when to use it - Cover key capabilities with practical examples - Follow Diataxis "Explanation" documentation style - Remove developer-focused architecture details 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix unimplemented pass_through auth strategy references Replace pass_through (not implemented) with actual implemented strategies: - unauthenticated: for backends requiring no auth - header_injection: for API keys and bearer tokens - token_exchange: for RFC 8693 token exchange The only implemented outgoing auth strategies are: - unauthenticated - header_injection - token_exchange pass_through is in the design but not yet implemented (see TODO in pkg/vmcp/config/validator.go). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix broken link to deleted quickstart.mdx Update configuration.mdx to link to intro.mdx instead of the deleted quickstart.mdx file. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Address PR feedback for Virtual MCP documentation - Change title from "Virtual MCP architecture" to "Understanding Virtual MCP Server" to better reflect user-focused content - Remove specific percentages (90%, 87%) that sound LLM-generated - Simplify authentication section: reference MCP spec mechanism instead of specific implementation details like token exchange - Update related links to match new title 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix vMCP docs to match actual CRD field names - authentication.mdx: Fix outgoing auth types to use actual CRD values (discovered, pass_through, external_auth_config_ref) instead of fictional types (unauthenticated, token_exchange, header_injection) - authentication.mdx: Clarify that MCPExternalAuthConfig defines the actual auth strategies (tokenExchange, headerInjection) - composite-tools.mdx: Fix field names (dependsOn, onError, maxRetries) to match CRD; remove fictional elicitation fields (onDecline, onCancel) - configuration.mdx: Refactor from reference doc to how-to guide; link to autogenerated CRD spec; fix incoming auth types (anonymous, local, oidc with kubernetes/configMap/inline subtypes) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Add working YAML examples to vMCP quickstart tutorial Replace TODO placeholders with actual working examples provided by jhrozek from testing: - MCPGroup manifest for demo-tools - MCPServer manifests for fetch and osv servers - VirtualMCPServer manifest with anonymous auth and prefix strategy 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix vMCP docs: remove non-existent CRD features Verified against VirtualMCPServer CRD (virtualmcpserver_types.go): - Remove pass_through from outgoing auth (CRD only has discovered, external_auth_config_ref) - Add Failed to status phase list (CRD has Pending, Ready, Degraded, Failed) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Address jhrozek's PR feedback on vMCP documentation Based on PR review feedback: authentication.mdx: - Add OIDC inline configuration example with clientSecretRef - Add Kubernetes service account token example - REMOVE token caching section (not implemented per jhrozek) configuration.mdx: - REMOVE token caching section (not implemented) - Add link to quickstart for MCPGroup reference composite-tools.mdx: - Add info admonition noting elicitation has not been extensively tested 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Remove unimplemented features, add tool aggregation example authentication.mdx: - Remove Cedar authorization section (not implemented for vMCP) - Remove Cedar policies link from related information tool-aggregation.mdx: - Add note that MCPToolConfig via toolConfigRef is in development - Add complete working example with MCPGroup, MCPServers, and VirtualMCPServer showing prefix-based conflict resolution Verified against CRD definitions in virtualmcpserver_types.go, mcpserver_types.go, and mcpgroup_types.go. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Add workflow examples to composite-tools.mdx Replace TODO placeholders with working examples: - Incident investigation: parallel data gathering with dependsOn - Deployment with approval: elicitation step for human-in-the-loop - Cross-system data aggregation: template expansion between steps - Complete VirtualMCPServer manifest with inline composite tool Fixed parameter format to use JSON Schema (type: object, properties, required) instead of shorthand notation. Verified against CompositeToolSpec and WorkflowStep definitions in virtualmcpserver_types.go. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Add VS Code configuration to vMCP quickstart Adds VS Code/Copilot mcp.json configuration instructions to the Virtual MCP Server quickstart tutorial. Includes file paths for macOS and Linux, and links to client compatibility reference for other MCP clients. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix vMCP documentation based on cluster testing (#331) * Fix VirtualMCPServer output columns in quickstart Update expected kubectl output to match actual CRD printer columns: - Change STATUS to PHASE - Add BACKENDS and READY columns Verified by testing against live cluster. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Fix minimal VirtualMCPServer config to include required incomingAuth The vMCP binary requires incomingAuth.type to be specified. Without it, the pod crashes with: "incoming_auth.type must be one of: oidc, local, anonymous" Verified by testing against live cluster. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Add note about optional clientSecretRef for token introspection 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * Fix composite tools example tool reference (#337) - Change fetch.fetch_url to fetch.fetch (correct tool name) - Add comment clarifying llm.summarize is a hypothetical backend 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * Simplify authentication docs to tested configurations (#343) - Add warning for anonymous incoming authentication - Simplify outgoing auth to discovery mode only (tested working) - Remove broken default config (CRD/binary type mismatch) - Remove external_auth_config_ref examples (pending code fixes) - Remove TODO placeholders - Add link to configuration guide 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <[email protected]> * Fix outgoing auth and clarify OIDC clientSecretRef (#344) * Simplify outgoing auth in configuration docs - Remove broken default.type: discovered config - Remove broken source: mixed with external_auth_config_ref example - Simplify to just source: discovered (tested working) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * Clarify OIDC clientSecretRef is for opaque tokens - Separate basic OIDC example (without clientSecretRef) - Add explanation for opaque OAuth token introspection - Show full example with clientSecretRef for that use case 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]> * Polish vMCP docs (#347) * Polish vMCP documentation - Apply consistent terminology: 'Virtual MCP Server (vMCP)' on first mention, then 'vMCP' - Rewrite bullet lists with complete sentences - Add MCPGroup context explanation on first use - Expand outgoing auth configuration details - Enhance experimental feature warning - Improve language directness * Add vMCP usage to style guide and LLM instructions * Note that vMCP is part of the operator * Add vMCP to nav menu * Polish the intro * Polish the config guide - Add MCPGroup section since it doesn't have its own guide - Remove redundant auth content, just point to auth guide - Note that ClusterIP can be exposed via Ingress/Gateway * Add vMCP CRDs to operator deployment guide * Rename vMCP concepts file and re-order guides Feels like the tool aggregation and composite guides logically belong together. * Polish auth guide * Polish tool aggregation guide * Polish composite tools guide - Soften technical jargon ("DAG") - Add basic info up front before the full use cases - Make sure all YAML snippets have parent keys to make location and indentation clear * Polish the quickstart and concepts guides * Add quickstart and concepts links to index * Clarify inbound auth spec conformance * Clarify service options --------- Signed-off-by: Dan Barr <[email protected]> Co-authored-by: Dan Barr <[email protected]> * Address feedback about terminology Signed-off-by: Juan Antonio Osorio <[email protected]> --------- Signed-off-by: Dan Barr <[email protected]> Signed-off-by: Juan Antonio Osorio <[email protected]> Co-authored-by: Claude <[email protected]> Co-authored-by: Jakub Hrozek <[email protected]> Co-authored-by: Dan Barr <[email protected]> Co-authored-by: Dan Barr <[email protected]>
1 parent d351ac7 commit 49ce724

File tree

14 files changed

+1442
-11
lines changed

14 files changed

+1442
-11
lines changed

.github/copilot-instructions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ Common terms used in this project:
107107
- open source (not "open-source")
108108
- large language model (LLM)
109109
- Visual Studio Code ("VS Code" after first use)
110+
- Virtual MCP Server (vMCP) - a feature of ToolHive that aggregates multiple MCP servers into a single endpoint; use "Virtual MCP Server (vMCP)" on first use, "vMCP" thereafter
110111

111112
Check this list for consistent use within the documentation. If you find inconsistencies, update the text to match the preferred term. If you find a term that is not listed here, consider adding it to the list for future reference.
112113

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ Common terms used in this project:
107107
- open source (not "open-source")
108108
- large language model (LLM)
109109
- Visual Studio Code ("VS Code" after first use)
110+
- Virtual MCP Server (vMCP) - a feature of ToolHive that aggregates multiple MCP servers into a single endpoint; use "Virtual MCP Server (vMCP)" on first use, "vMCP" thereafter
110111

111112
Check this list for consistent use within the documentation. If you find inconsistencies, update the text to match the preferred term. If you find a term that is not listed here, consider adding it to the list for future reference.
112113

STYLE-GUIDE.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,11 @@ all caps. Written out, it is lower-cased.
263263
applications provide context to LLMs. MCP is an abbreviation, so it's written in
264264
all caps. Written out, it is proper-cased.
265265

266+
**vMCP**: Virtual MCP Server, a feature of ToolHive that aggregates multiple MCP
267+
servers into a single endpoint. It's written with a lowercase "v" followed by
268+
"MC" in all caps and a capital "P" (not "VMCP" or "Vmcp"). Use "Virtual MCP
269+
Server (vMCP)" on first use, "vMCP" thereafter.
270+
266271
**npm**: the registry for JavaScript packages (the "npm registry"), and the
267272
default package manager for JavaScript. Since it's both the registry _and_ the
268273
package manager, it may be useful to disambiguate "the npm registry". It's not

docs/toolhive/concepts/vmcp.mdx

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
---
2+
title: Understanding Virtual MCP Server
3+
sidebar_label: Virtual MCP Server (vMCP)
4+
description:
5+
Learn what Virtual MCP Server does, why it exists, and when to use it.
6+
---
7+
8+
This document explains Virtual MCP Server (vMCP), a feature of the ToolHive
9+
Kubernetes Operator. You'll learn why it exists, when to use it, and how it
10+
simplifies managing multiple MCP servers while enabling powerful multi-system
11+
workflows.
12+
13+
## The problem vMCP solves
14+
15+
**Before vMCP**: Engineers manage 10+ separate MCP server connections, each with
16+
its own authentication, manually coordinate multi-step workflows across systems,
17+
and repeatedly configure the same parameters.
18+
19+
**With vMCP**: Connect once to a unified endpoint that aggregates all backend
20+
MCP servers, execute complex multi-system workflows declaratively, and use
21+
pre-configured tools with sensible defaults.
22+
23+
## Core value propositions
24+
25+
vMCP delivers four key benefits:
26+
27+
1. **Reduce complexity**: Many connections become one, dramatically simplifying
28+
configuration
29+
2. **Speed up workflows**: Parallel execution across systems instead of
30+
sequential calls
31+
3. **Improve security**: Centralized authentication and authorization with a
32+
two-boundary model
33+
4. **Enable reusability**: Define workflows once, use them everywhere
34+
35+
## Key capabilities
36+
37+
### Multi-server aggregation
38+
39+
Managing 10-20+ MCP server connections is overwhelming. Each server needs its
40+
own configuration, authentication, and maintenance. vMCP aggregates all backend
41+
MCP servers into one endpoint with automatic conflict resolution.
42+
43+
**Example scenario**: An engineering team needs access to 8 backend servers
44+
(GitHub, Jira, Slack, Confluence, PagerDuty, Datadog, AWS, and internal company
45+
docs). Instead of configuring 8 separate connections, they configure one vMCP
46+
connection with SSO. This significantly reduces configuration complexity and
47+
makes onboarding new team members much easier.
48+
49+
When multiple backend MCP servers have tools with the same name (for example,
50+
both GitHub and Jira have `create_issue`), vMCP automatically prefixes them:
51+
`github_create_issue`, `jira_create_issue`. You can also define custom names for
52+
clarity.
53+
54+
### Multi-step workflows (composition)
55+
56+
Real-world tasks span multiple systems and require manual orchestration. vMCP
57+
lets you define declarative workflows with parallel execution, conditionals,
58+
error handling, and human-in-the-loop approval gates.
59+
60+
**Example scenario**: During an incident investigation, you need logs from your
61+
logging system, metrics from your monitoring platform, traces from your tracing
62+
service, and infrastructure status from your cloud provider. Without vMCP, an
63+
engineer manually runs 4 commands sequentially and aggregates results. With
64+
vMCP, you fetch all of this in parallel, automatically aggregate it into a
65+
formatted report, and create a Jira ticket with all the data. This workflow is
66+
reusable for every incident.
67+
68+
**Example scenario**: For an app deployment, merge the pull request, wait for
69+
tests, ask a human for approval, deploy only if approved, and notify the team in
70+
Slack. vMCP handles this entire flow declaratively, with automatic rollback on
71+
deployment failure.
72+
73+
### Tool customization and overrides
74+
75+
Third-party MCP servers often have generic names, descriptions, and unrestricted
76+
parameters. vMCP lets you filter, rename, and wrap tools without modifying the
77+
upstream servers.
78+
79+
**Security policy enforcement**: You can restrict a fetch tool to internal
80+
domains only (`*.company.com`), validate URLs before calling the backend, and
81+
provide clear error messages for policy violations.
82+
83+
**Simplified interfaces**: A complex tool like AWS EC2 might have 20+
84+
parameters, but your frontend team only needs 3. You can create a simplified
85+
wrapper that uses instance names instead of IDs and pre-fills safe defaults for
86+
all other parameters.
87+
88+
### Parameter defaults and pre-configuration
89+
90+
Generic servers require repetitive parameter specification. You always use the
91+
same repo, channel, or database. vMCP lets you create specialized instances with
92+
pre-configured defaults.
93+
94+
**Example scenario**: Without vMCP, every GitHub query requires specifying
95+
`repo: stacklok/toolhive`. With vMCP, you pre-configure this default - engineers
96+
never specify the repo parameter, and they can't accidentally query the wrong
97+
repository. This eliminates hundreds of repetitive parameter entries per week.
98+
99+
**Example scenario**: Configure staging database as the default (safe for
100+
development), while production queries require an explicit approval gate.
101+
Connection details are centralized in vMCP configuration instead of scattered
102+
across individual tool configurations.
103+
104+
### Authentication boundary separation
105+
106+
Different authentication is needed for clients versus backend MCP servers, and
107+
managing credentials across multiple systems is complex. vMCP implements a
108+
two-boundary auth model that separates these concerns.
109+
110+
**How it works**: Clients authenticate to vMCP using OAuth 2.1 authorization as
111+
defined in the MCP specification. vMCP then handles authentication to each
112+
backend MCP server independently. Revoking access is simple: disable the user in
113+
your identity provider and all backend access is revoked instantly.
114+
115+
This approach provides single sign-on for users, centralized access control, and
116+
a complete audit trail.
117+
118+
## When to use vMCP
119+
120+
### Good fit
121+
122+
- Teams managing 5+ MCP servers
123+
- Tasks requiring coordination across multiple systems
124+
- Centralized authentication and authorization requirements
125+
- Workflows that should be reusable across the team
126+
- Security policies that need centralized enforcement
127+
128+
### Not needed
129+
130+
- Single MCP server usage
131+
- Simple, one-step operations
132+
- No orchestration requirements
133+
134+
## Summary
135+
136+
vMCP transforms MCP from individual servers into a unified orchestration
137+
platform. The use cases range from simple aggregation to complex workflows with
138+
approval gates, making it valuable for teams managing multiple MCP servers.
139+
140+
## Related information
141+
142+
- [Deploy vMCP](../guides-vmcp/intro.mdx)
143+
- [Configure authentication](../guides-vmcp/authentication.mdx)
144+
- [Tool aggregation and conflict resolution](../guides-vmcp/tool-aggregation.mdx)
145+
- [Composite tools and workflows](../guides-vmcp/composite-tools.mdx)

docs/toolhive/guides-k8s/deploy-operator-helm.mdx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ chart. To install a specific version, append `--version <VERSION>` to the
3333
command, for example:
3434

3535
```bash
36-
helm upgrade --install toolhive-operator-crds oci://ghcr.io/stacklok/toolhive/toolhive-operator-crds --version 0.0.52
36+
helm upgrade --install toolhive-operator-crds oci://ghcr.io/stacklok/toolhive/toolhive-operator-crds --version 0.0.73
3737
```
3838

3939
## Install the operator
@@ -52,7 +52,7 @@ chart. To install a specific version, append `--version <VERSION>` to the
5252
command, for example:
5353

5454
```bash
55-
helm upgrade --install toolhive-operator oci://ghcr.io/stacklok/toolhive/toolhive-operator -n toolhive-system --create-namespace --version 0.3.7
55+
helm upgrade --install toolhive-operator oci://ghcr.io/stacklok/toolhive/toolhive-operator -n toolhive-system --create-namespace --version 0.5.6
5656
```
5757

5858
Verify the installation:
@@ -237,21 +237,23 @@ and then apply the CRDs using `kubectl`.
237237
First, upgrade the CRD Helm chart to match your target operator version:
238238

239239
```bash
240-
helm upgrade -i toolhive-operator-crds oci://ghcr.io/stacklok/toolhive/toolhive-operator-crds --version 0.0.52
240+
helm upgrade -i toolhive-operator-crds oci://ghcr.io/stacklok/toolhive/toolhive-operator-crds --version 0.0.73
241241
```
242242

243243
Then apply the CRDs from the same version tag:
244244

245245
```bash
246-
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.52/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpexternalauthconfigs.yaml
247-
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.52/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcptoolconfigs.yaml
248-
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.52/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpremoteproxies.yaml
249-
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.52/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpservers.yaml
250-
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.52/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpgroups.yaml
251-
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.52/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpregistries.yaml
246+
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.73/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpexternalauthconfigs.yaml
247+
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.73/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcptoolconfigs.yaml
248+
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.73/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpremoteproxies.yaml
249+
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.73/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpservers.yaml
250+
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.73/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpgroups.yaml
251+
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.73/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_mcpregistries.yaml
252+
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.73/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_virtualmcpcompositetooldefinitions.yaml
253+
kubectl apply -f https://raw.githubusercontent.com/stacklok/toolhive/refs/tags/toolhive-operator-crds-0.0.73/deploy/charts/operator-crds/crds/toolhive.stacklok.dev_virtualmcpservers.yaml
252254
```
253255

254-
Replace `0.0.52` in both commands with your target CRD version.
256+
Replace `0.0.73` in both commands with your target CRD version.
255257

256258
### Upgrade the operator Helm release
257259

@@ -267,7 +269,7 @@ This upgrades the operator to the latest version available in the OCI registry.
267269
To upgrade to a specific version, add the `--version` flag:
268270

269271
```bash
270-
helm upgrade -i toolhive-operator oci://ghcr.io/stacklok/toolhive/toolhive-operator -n toolhive-system --reuse-values --version 0.3.7
272+
helm upgrade -i toolhive-operator oci://ghcr.io/stacklok/toolhive/toolhive-operator -n toolhive-system --reuse-values --version 0.5.6
271273
```
272274

273275
If you have a custom `values.yaml` file, include it with the `-f` flag:
@@ -302,6 +304,8 @@ kubectl delete crd mcpremoteproxies.toolhive.stacklok.dev
302304
kubectl delete crd mcpservers.toolhive.stacklok.dev
303305
kubectl delete crd mcpgroups.toolhive.stacklok.dev
304306
kubectl delete crd mcpregistries.toolhive.stacklok.dev
307+
kubectl delete crd virtualmcpcompositetooldefinitions.toolhive.stacklok.dev
308+
kubectl delete crd virtualmcpservers.toolhive.stacklok.dev
305309
```
306310

307311
Finally, uninstall the CRD Helm chart metadata:

0 commit comments

Comments
 (0)