Repository navigation
FAQ
Only HTTP endpoints: Streamable HTTP and legacy HTTP+SSE. vMCP does not launch upstream server processes.
Curated resources, templates and prompts are supported with explicit selections, aliases, namespace validation, completion and subscription grants. See catalog contract.
No. Redis only makes rate limits global across nodes (Rate limits). Everything else uses PostgreSQL.
Check, in order: the upstream is enabled and healthy; the tool still exists after a refresh (orphaned selections are not
served); the policy does not block it (read_only needs readOnlyHint from the upstream); the exposed
name is unique.
- For agent keys: the virtual server requires auth (
authRequired), the key does not list that virtual server, it expired or was revoked, or your IP is outsideipAllowlist(behind a proxy, setVMCP_TRUSTED_PROXIES). - For OAuth JWTs: check
WWW-Authenticateheader. 401 indicates a missing or expired/invalid token (must be an asymmetric JWT withaudmatchingVMCP_AGENT_OIDC_AUDIENCE). 403 indicates no identity binding matched the token's claims, or the matching binding does not authorize this virtual server or client IP.
A rate limit was hit; honour Retry-After. Without Redis each node counts separately.
The circuit breaker saw repeated transport failures. It probes again after the cooldown; check
the upstream's health in the UI or GET /api/v1/upstreams. Note that OAuth token acquisition failures (IdP down or invalid client credentials) do not count toward circuit breaker failure thresholds.
See the table in Upstream TLS.
It reloads via PostgreSQL LISTEN/NOTIFY. Check data-plane logs and that it uses the same database as the control plane.
VMCP_MASTER_KEY differs from the key that encrypted them (both services must share it).
Check the configured public gateway URL and use HTTPS for both the UI and gateway when the UI is served over HTTPS. For separate origins, the data-plane origin allowlist and the reverse proxy's CORS responses must both permit the exact UI origin. The gateway does not add CORS headers itself. See browser verification setup.
Grant the upstream's actual private IP/subnet with VMCP_EGRESS_ALLOW_CIDRS on
both planes and restart them. A hostname allowlist alone does not authorize a
private address. Container localhost points to that container, not your host.
Use the final endpoint URL; redirects are rejected. See Network security.
Edit the virtual server and enable authentication required. Issuing a key does
not change authRequired:false. Also check that the key grants access to the
intended virtual server. See Authentication.
- Protocol baseline is 2025-06-18; newer revisions and March batching are not advertised.
- Resource update hints can be missed during physical watcher reconnection; durable gateway replay does not make upstream events exactly once.
- Unsafe calls with ambiguous outcomes are not automatically repeated.
- Circuit-breaker state and local fallback rate limits are per node; shared strict rate limits require Redis.
- Regex masking does not guarantee privacy or prompt-injection prevention. Binary content is denied when inspection is required.
- JWT early revocation uses exact-token digests; arbitrary opaque tokens/introspection are unsupported.
- Tenant isolation uses dedicated plane/database deployments; shared-schema tenant switching is excluded.
- Production HA, restore, workload scaling and compliance gates require operator evidence. See deployment.
vMCP is licensed under Apache-2.0. This wiki is generated from the docs/ folder of the repository: send documentation fixes as pull requests, not wiki edits.
- Getting started
- Guided setup and client connections
- Installation options
- Kubernetes quickstart
- Install a published release
- Upstreams
- Virtual servers
- Resources and prompts
- Agent keys and authentication
- OAuth for agents
- SSO and roles
- Tool policies
- PII masking
- Rate limits
- Audit log
- FAQ and troubleshooting