Skip to content
funggierPublic

About

Deterministic MCP gateway for federating multiple MCP servers

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

37 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

VGate

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.

Current baseline

  • 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

Quick start

npm install
npm run typecheck
npm test
npm run build
Copy-Item config\vgate.example.json vgate.local.json
node dist\server-stdio.js

vgate.local.json is intentionally ignored by Git. Keep machine-specific paths and secrets out of tracked configuration.

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.

Gateway control tools

  • vgate_status — current provider state and capability counts
  • vgate_list_providers — compact provider inventory
  • vgate_refresh — reconnect providers, rediscover capabilities, and reconcile the upstream surface

Game-development providers

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.0 over 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.3 stdio bridge. Live editor operations require the Godot MCP Toolkit plugin enabled in the target Godot 4.2+ project. Set GODOT_MCP_CONFIG_VERSION=1; when VGate runs outside the target project directory, set GODOT_MCP_PROJECT_PATH in local provider env to that project's absolute path so registry discovery selects the correct editor instance. On Windows, production config wraps npx with cmd.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 set MONOGAME_MCP_ALLOWED_ROOT only 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 and r88.monogame is optional.

  • CLIP STUDIO PAINT — VGate-owned Windows stdio provider for CLIP STUDIO PAINT 4.x. Configure CLIPSTUDIO_MCP_EXE to 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_status supports 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.

Windows tunnel lifecycle

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.

Conditional read cache

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: 0 revalidates 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_refresh always 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_status tool uses the same digest-only contract.

Security

  • 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.

Development

npm run typecheck
npm test
npm run build
npm audit

Architecture and implementation records live under docs/.

About

Deterministic MCP gateway for federating multiple MCP servers

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages