VGate is a deterministic MCP gateway that federates multiple downstream MCP servers behind one upstream MCP connection.
ChatGPT / MCP Host
|
| MCP (stdio or Streamable HTTP)
v
VGate
discovery / routing
namespace / policy
health / refresh
|
+----+--------+--------+--------+----------+
| | | | |
Roblox MCP Blender Unity MCP Godot MCP MonoGame ClipStudio
VGate does not contain an LLM. The upstream agent decides what to do; VGate discovers capabilities and routes each MCP operation to the correct provider.
-
Release: v0.1.4 — CLIP STUDIO PAINT Provider
-
Node.js 20+ / TypeScript
-
MCP TypeScript SDK v2
-
Upstream: stdio and Streamable HTTP
-
Downstream: stdio and Streamable HTTP
-
Dynamic tool discovery and JSON Schema proxying
-
Prompt federation
-
Static resource federation
-
Provider-level failure isolation and request timeouts
-
Hot capability refresh through
vgate_refresh -
Namespaced tools:
<provider>__<tool> -
Profiles and allow/deny tool policy
-
Local-only tunnel settings with separate Tunnel ID / Organization ID / health port state
-
Windows DPAPI Runtime API key storage (API-key-only for new writes)
-
Conditional SHA-256 read cache for VGate-owned status/provider inventory responses
-
VGate-owned CLIP STUDIO PAINT provider with guarded Windows input and bounded window capture
npm install
npm run typecheck
npm test
npm run build
Copy-Item config\vgate.example.json vgate.local.json
node dist\server-stdio.jsvgate.local.json is intentionally ignored by Git. Keep machine-specific paths and secrets out of tracked configuration.
See config/vgate.example.json. A provider can use either:
{
"transport": "stdio",
"command": "some-mcp-server",
"args": []
}or:
{
"transport": "http",
"url": "http://127.0.0.1:9000/mcp"
}Environment references use ${env:NAME}. Provider IDs become namespaces; for example blender + get_objects_summary is exported as blender__get_objects_summary.
vgate_status— current provider state and capability countsvgate_list_providers— compact provider inventoryvgate_refresh— reconnect providers, rediscover capabilities, and reconcile the upstream surface
The example profile includes six independent MCP providers:
-
Roblox Studio — official
StudioMCP.exe; the included launcher resolves the newest installed Roblox Studio version at runtime so updates do not hard-code a version directory -
Blender — Blender Lab MCP server paired with the Blender MCP add-on; the example uses Blender MCP v1.0.3 and the add-on bridge on localhost:9876
-
Unity —
mcpforunityserver==10.3.0over stdio; editor-dependent operations require the matching Unity MCP package/editor bridge to be active. On Windows, choose an editor bridge port outside OS excluded TCP ranges. -
Godot — pinned
@npgamedev/godot-mcp-server@1.0.3stdio bridge. Live editor operations require the Godot MCP Toolkit plugin enabled in the target Godot 4.2+ project. SetGODOT_MCP_CONFIG_VERSION=1; when VGate runs outside the target project directory, setGODOT_MCP_PROJECT_PATHin local provider env to that project's absolute path so registry discovery selects the correct editor instance. On Windows, production config wrapsnpxwithcmd.exe /d /c. -
MonoGame — VGate-owned bounded stdio provider for MonoGame 3.8.6 project inspection, project/content build, controlled project creation and bounded run operations. Install
MonoGame.Templates.CSharp@3.8.6, use .NET 10 (qualification baseline: 10.0.401), and setMONOGAME_MCP_ALLOWED_ROOTonly in local environment/config to the parent directory containing allowed MonoGame projects. The provider supports the MonoGame 3.8.6 Content Builder workflow and detects legacy MGCB projects when present. VS Code can use the same CLI contracts; C# Dev Kit/C# are recommended andr88.monogameis optional. -
CLIP STUDIO PAINT — VGate-owned Windows stdio provider for CLIP STUDIO PAINT 4.x. Configure
CLIPSTUDIO_MCP_EXEto the machine-local executable. The provider exposes status/launch/focus/open/save/undo/redo plus guarded allowlisted keyboard and in-window mouse primitives. Window capture is file-backed by default and inline image payloads are opt-in.application_statussupports SHA-256 conditional reads with digest-only TTL metadata caching; provider mutation tools are never cached.
These are configuration examples, not hard-coded VGate integrations. Any compatible MCP server can be added without changing VGate core.
For a local ChatGPT tunnel installation:
Setup-VGate.cmd
Start-VGate.cmd
Stop-VGate.cmd
Restart-VGate.cmd
Status-VGate.cmd
Clear-VGateSettings.cmd
Setup-VGate.cmd stores Tunnel ID / Organization ID / health port in local-secrets\vgate-settings.json, stores only the Runtime API key in DPAPI-protected local-secrets\vgate-tunnel.json.enc, and generates mcp-conf.yaml automatically. Existing combined credentials remain readable for one-time migration.
Clear-VGateSettings.cmd can clear only the API key, only connection settings, or all generated tunnel state. Clearing connection settings preserves the API key while removing any legacy Organization ID retained inside the encrypted credential.
The active tunnel profile mcp-conf.yaml, tunnel-client.exe, vgate.local.json, encrypted credentials, runtime state, and logs are local-only and excluded from Git. Restart-VGate.cmd launches a detached worker so the current tunnel can disconnect and be brought back even when the restart originated from the connection being replaced. Status-VGate.cmd and Stop-VGate.cmd keep their result visible by default; automation can use --no-hold to return immediately while preserving the underlying PowerShell exit code.
vgate_status and vgate_list_providers support optional known_digest and cache_max_age_ms inputs. Successful responses expose result_digest_sha256 and cache metadata.
cache_max_age_ms: 0revalidates the current gateway snapshot and suppresses the body when unchanged.- A positive TTL may short-circuit a repeated safe read when matching digest metadata is still fresh.
- The cache stores digest/size/timestamp metadata only; it does not retain result content.
vgate_refreshalways executes and clears the control-read cache.- Proxied provider tools, prompts, and resources are never cached by this layer.
- Providers may implement their own bounded read cache when explicitly documented; the CLIP STUDIO PAINT
application_statustool uses the same digest-only contract.
- stdio diagnostic logs are written to stderr, never MCP stdout.
- Tool deny rules override allow rules.
- An allow list, when present, is authoritative.
- Secrets should be supplied through environment references or the local DPAPI credential file.
- HTTP examples bind to loopback by default.
- VGate never executes provider-specific commands itself; operations are delegated through the selected downstream MCP server.
npm run typecheck
npm test
npm run build
npm auditArchitecture and implementation records live under docs/.