Skip to content

Commit 68a1c38

Browse files
committed
Address feedback and change scenarios to the ones I used in demos
Signed-off-by: Juan Antonio Osorio <[email protected]>
1 parent d44013d commit 68a1c38

File tree

4 files changed

+125
-133
lines changed

4 files changed

+125
-133
lines changed

docs/toolhive/concepts/vmcp.mdx

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ workflows.
1616
its own authentication, manually coordinate multi-step workflows across systems,
1717
and repeatedly configure the same parameters.
1818

19-
**With vMCP**: Connect once to a unified endpoint that aggregates all backends,
20-
execute complex multi-system workflows declaratively, and use pre-configured
21-
tools with sensible defaults.
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.
2222

2323
## Core value propositions
2424

@@ -37,17 +37,17 @@ vMCP delivers four key benefits:
3737
### Multi-server aggregation
3838

3939
Managing 10-20+ MCP server connections is overwhelming. Each server needs its
40-
own configuration, authentication, and maintenance. vMCP aggregates all backends
41-
into one endpoint with automatic conflict resolution.
40+
own configuration, authentication, and maintenance. vMCP aggregates all backend
41+
MCP servers into one endpoint with automatic conflict resolution.
4242

4343
**Example scenario**: An engineering team needs access to 8 backend servers
4444
(GitHub, Jira, Slack, Confluence, PagerDuty, Datadog, AWS, and internal company
4545
docs). Instead of configuring 8 separate connections, they configure one vMCP
4646
connection with SSO. This significantly reduces configuration complexity and
4747
makes onboarding new team members much easier.
4848

49-
When multiple backends have tools with the same name (for example, both GitHub
50-
and Jira have `create_issue`), vMCP automatically prefixes them:
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:
5151
`github_create_issue`, `jira_create_issue`. You can also define custom names for
5252
clarity.
5353

@@ -57,18 +57,19 @@ Real-world tasks span multiple systems and require manual orchestration. vMCP
5757
lets you define declarative workflows with parallel execution, conditionals,
5858
error handling, and human-in-the-loop approval gates.
5959

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.
60+
**Real example**: The `aggregate_docs` composite tool fetches documentation from
61+
multiple sources in parallel (MCP specification, Python SDK, and server
62+
implementations), then aggregates them into a structured report with metadata.
63+
Without vMCP, you'd manually fetch each URL sequentially. With vMCP, all three
64+
fetches run concurrently, and results are automatically combined with timing
65+
information and status for each source.
6766

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.
67+
**Real example**: The `investigate_image` composite tool analyzes container
68+
images by querying an OCI registry for image info, manifest, and configuration
69+
in a coordinated workflow. The first step fetches basic info, then the manifest
70+
and config steps run in parallel (both depend on the initial step). This
71+
demonstrates how vMCP orchestrates multi-step operations across backend MCP
72+
servers with dependency management.
7273

7374
### Tool customization and overrides
7475

@@ -91,21 +92,24 @@ Generic servers require repetitive parameter specification. You always use the
9192
same repo, channel, or database. vMCP lets you create specialized instances with
9293
pre-configured defaults.
9394

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.
95+
**Real example**: The `analyze_repository` composite tool demonstrates parameter
96+
defaults. The tool accepts `owner` and `repo` parameters with defaults set to
97+
`modelcontextprotocol` and `specification`. Engineers can run the tool without
98+
specifying these parameters for the common case, or override them when analyzing
99+
different repositories. This eliminates repetitive parameter entry while
100+
maintaining flexibility.
98101

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.
102+
**Real example**: In the demo configuration, all three composite tools
103+
(`aggregate_docs`, `analyze_repository`, `investigate_image`) have
104+
pre-configured defaults - documentation URLs, repository names, and container
105+
image references. This makes the tools immediately usable while remaining
106+
customizable for different scenarios.
103107

104108
### Authentication boundary separation
105109

106-
Different auth is needed for clients versus backends, and managing credentials
107-
across multiple systems is complex. vMCP implements a two-boundary auth model
108-
that separates these concerns.
110+
Different authentication is needed for clients versus backend MCP servers, and
111+
managing credentials across multiple systems is complex. vMCP implements a
112+
two-boundary auth model that separates these concerns.
109113

110114
**How it works**: Clients authenticate to vMCP using OAuth 2.1 authorization as
111115
defined in the MCP specification. vMCP then handles authentication to each

docs/toolhive/guides-vmcp/composite-tools.mdx

Lines changed: 67 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ description: Create multi-step workflows that span multiple backend MCP servers.
44
---
55

66
Composite tools let you define multi-step workflows that execute across multiple
7-
backends with parallel execution, conditional logic, approval gates, and error
8-
handling.
7+
backend MCP servers with parallel execution, conditional logic, approval gates,
8+
and error handling.
99

1010
## Overview
1111

1212
A composite tool combines multiple backend tool calls into a single workflow.
1313
When a client calls a composite tool, vMCP orchestrates the execution across
14-
backends, handling dependencies and collecting results.
14+
backend MCP servers, handling dependencies and collecting results.
1515

1616
## Key capabilities
1717

@@ -98,126 +98,112 @@ and returns the final summary.
9898

9999
## Use cases
100100

101-
### Incident investigation
101+
### Multi-source documentation aggregation
102102

103-
Gather data from multiple monitoring systems in parallel:
103+
Fetch and aggregate documentation from multiple sources in parallel:
104104

105105
```yaml title="VirtualMCPServer resource"
106106
spec:
107107
compositeTools:
108-
- name: investigate_incident
109-
description: Gather incident data from multiple sources in parallel
108+
- name: aggregate_docs
109+
description: Fetch and aggregate documentation from multiple sources
110110
parameters:
111111
type: object
112112
properties:
113-
incident_id:
114-
type: string
115-
required:
116-
- incident_id
113+
sources:
114+
type: array
115+
default:
116+
- https://raw.githubusercontent.com/modelcontextprotocol/specification/main/README.md
117+
- https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/main/README.md
118+
- https://raw.githubusercontent.com/modelcontextprotocol/servers/main/README.md
119+
timeout: '2m'
117120
steps:
118-
# These steps run in parallel (no dependencies)
119-
- id: get_logs
120-
tool: logging.search_logs
121+
# These three steps run in parallel (no dependencies)
122+
- id: fetch_source_1
123+
tool: fetch_fetch
121124
arguments:
122-
query: 'incident_id={{.params.incident_id}}'
123-
timerange: '1h'
124-
- id: get_metrics
125-
tool: monitoring.get_metrics
125+
url: '{{index .params.sources 0}}'
126+
max_length: 5000
127+
- id: fetch_source_2
128+
tool: fetch_fetch
126129
arguments:
127-
filter: 'error_rate'
128-
timerange: '1h'
129-
- id: get_alerts
130-
tool: pagerduty.list_alerts
130+
url: '{{index .params.sources 1}}'
131+
max_length: 5000
132+
- id: fetch_source_3
133+
tool: fetch_fetch
131134
arguments:
132-
incident: '{{.params.incident_id}}'
133-
# This step waits for all parallel steps to complete
134-
- id: create_summary
135-
tool: docs.create_document
136-
arguments:
137-
title: 'Incident {{.params.incident_id}} Summary'
138-
content: 'Logs: {{.steps.get_logs.output.results}}'
139-
dependsOn: [get_logs, get_metrics, get_alerts]
135+
url: '{{index .params.sources 2}}'
136+
max_length: 5000
140137
```
141138

142-
### Deployment with approval
139+
### GitHub repository analysis
143140

144-
Human-in-the-loop workflow for production deployments:
141+
Analyze a GitHub repository's health and activity:
145142

146143
```yaml title="VirtualMCPServer resource"
147144
spec:
148145
compositeTools:
149-
- name: deploy_with_approval
150-
description: Deploy to production with human approval gate
146+
- name: analyze_repository
147+
description: Analyze a GitHub repository's health and activity
151148
parameters:
152149
type: object
153150
properties:
154-
pr_number:
151+
owner:
155152
type: string
156-
environment:
153+
default: modelcontextprotocol
154+
repo:
157155
type: string
158-
default: production
159-
required:
160-
- pr_number
156+
default: specification
157+
timeout: '2m'
161158
steps:
162-
- id: get_pr_details
163-
tool: github.get_pull_request
159+
# These steps run in parallel
160+
- id: list_issues
161+
tool: github_list_issues
164162
arguments:
165-
pr: '{{.params.pr_number}}'
166-
- id: approval
167-
type: elicitation
168-
message:
169-
'Deploy PR #{{.params.pr_number}} to {{.params.environment}}?'
170-
schema:
171-
type: object
172-
properties:
173-
approved:
174-
type: boolean
175-
timeout: '10m'
176-
dependsOn: [get_pr_details]
177-
- id: deploy
178-
tool: deploy.trigger_deployment
163+
owner: '{{.params.owner}}'
164+
repo: '{{.params.repo}}'
165+
perPage: 5
166+
- id: list_commits
167+
tool: github_list_commits
179168
arguments:
180-
ref: '{{.steps.get_pr_details.output.head_sha}}'
181-
environment: '{{.params.environment}}'
182-
condition: '{{.steps.approval.content.approved}}'
183-
dependsOn: [approval]
169+
owner: '{{.params.owner}}'
170+
repo: '{{.params.repo}}'
171+
perPage: 3
184172
```
185173

186-
### Cross-system data aggregation
174+
### Container image investigation
187175

188-
Collect and correlate data from multiple backends:
176+
Investigate a container image from an OCI registry:
189177

190178
```yaml title="VirtualMCPServer resource"
191179
spec:
192180
compositeTools:
193-
- name: security_scan_report
194-
description: Run security scans and create consolidated report
181+
- name: investigate_image
182+
description: Investigate a container image from an OCI registry
195183
parameters:
196184
type: object
197185
properties:
198-
repo:
186+
image:
199187
type: string
200-
required:
201-
- repo
188+
default: docker.io/library/alpine:latest
189+
timeout: '2m'
202190
steps:
203-
- id: vulnerability_scan
204-
tool: osv.scan_dependencies
191+
# Step 1: Get basic image information
192+
- id: get_image_info
193+
tool: oci-registry_get_image_info
205194
arguments:
206-
repository: '{{.params.repo}}'
207-
- id: secret_scan
208-
tool: gitleaks.scan_repo
195+
image_ref: '{{.params.image}}'
196+
# Steps 2 and 3 run in parallel (both depend on step 1)
197+
- id: get_manifest
198+
tool: oci-registry_get_image_manifest
209199
arguments:
210-
repository: '{{.params.repo}}'
211-
- id: create_issue
212-
tool: github.create_issue
200+
image_ref: '{{.params.image}}'
201+
dependsOn: [get_image_info]
202+
- id: get_config
203+
tool: oci-registry_get_image_config
213204
arguments:
214-
repo: '{{.params.repo}}'
215-
title: 'Security Scan Results'
216-
body:
217-
'Found {{.steps.vulnerability_scan.output.count}} vulnerabilities'
218-
dependsOn: [vulnerability_scan, secret_scan]
219-
onError:
220-
action: continue
205+
image_ref: '{{.params.image}}'
206+
dependsOn: [get_image_info]
221207
```
222208

223209
## Workflow definition

docs/toolhive/guides-vmcp/intro.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ through a single endpoint.
1414
## Core capabilities
1515

1616
- **Multi-server aggregation**: Connect to one endpoint instead of many
17-
- **Tool conflict resolution**: Automatic namespacing when backends have
18-
overlapping tool names
17+
- **Tool conflict resolution**: Automatic namespacing when backend MCP servers
18+
have overlapping tool names
1919
- **Centralized authentication**: Single sign-on with per-backend token exchange
20-
- **Composite workflows**: Multi-step operations across backends with parallel
21-
execution, approval gates, and error handling
20+
- **Composite workflows**: Multi-step operations across backend MCP servers with
21+
parallel execution, approval gates, and error handling
2222

2323
## When to use vMCP
2424

0 commit comments

Comments
 (0)