NV oOS Gateway

io.github.nvdigitalsolutions由 GitHub 帳號 nvdigitalsolutions 發布v0.3.1更新於 Nov 4, 2026

Streamable HTTP MCP gateway for NV oOS fleets — one API key, namespaced tools, quotas and policy.

已驗證Streamable HTTP可網頁執行效率與工作流開發者工具安全與監控

概覽

AI 產生的概覽

遠端 MCP 閘道,用一組 API 金鑰曝露多個 NV oOS WordPress 站台的工具,並提供命名空間、配額與政策控管。

可以做什麼
  • 列出並呼叫金鑰所綁定的所有 NV oOS WordPress 站台工具,合併成帶站台前綴的清單,例如 site-a.create_post
  • 透過閘道執行站台工具,閘道會把 initialize、tools/list 與 tools/call 轉送到各站台原生的 MCP 端點
  • 用 dry-run 參數試算呼叫而不實際執行,回報政策與配額是否放行
  • 透過僅限維運權杖的管理端點查看站台健康狀態、生效政策與配額表,以及各站台的目錄狀態
  • 當閘道設定為受保護資源時,可用 OAuth 2.1 權杖取代靜態金鑰
適用情境
適合需要以單一端點與單一憑證同時操作多個 NV oOS WordPress 站台的情況,也適合希望在站台之上統一設定工具配額、拒絕或審批規則,並依站台區分工具名稱的團隊。
執行需求
遠端 streamable HTTP 端點,不需本機安裝。需要一組綁定到一個或多個站台 slug 的 NV Digital Solutions 閘道 API 金鑰,透過 Authorization Bearer 標頭送出。可選擇使用外部授權伺服器的 OAuth 2.1。需要能連線到閘道及所綁定的站台。
安裝前請注意
該金鑰可存取其綁定的所有站台,應謹慎限縮範圍並定期輪替。工具呼叫會在 WordPress 站台上執行實際操作,包括內容與商店操作;政策規則可拒絕或要求審批,但由伺服器端設定。上游 Fleet Operator 權杖由閘道保管,治理事件可傳送到外部稽核 webhook。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 NV oOS Gateway,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.nvdigitalsolutions%2Fnvoos-mcp-gateway/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "nv-oos-gateway": {
      "type": "http",
      "url": "https://mcp.nvoos.pro/mcp"
    }
  }
}

README

NV oOS MCP Gateway

==================

[NV oOS MCP Gateway]

A public, fleet-scoped Model Context Protocol endpoint for the NV oOS (Open Operator System) WordPress platform. One API key, every bound site — tools appear namespaced as <site-slug>.<tool>.

The gateway is an MCP aggregating proxy speaking streamable HTTP (MCP 2026-07-28): it authenticates callers with a public API key, forwards initialize / tools/list / tools/call to the bound NV oOS sites' native /wp-json/mcp-ai/v1/mcp endpoints using Fleet Operator tokens, and keeps the fleet surface collision-free by prefixing tool names per site.

Deployment target: Cloudways Velocity (managed Node hosting) at https://mcp.nvoos.pro. See docs/operations/deployment/mcp-gateway-velocity-setup.md.

One-way mirror: this addon is the canonical source and is synced to the standalone repo nvdigitalsolutions/nvoos-mcp-gateway (branch main) by sync-mcp-gateway.yml, which snapshots the subtree as one commit per sync and pushes without --force — the mirror main stays a linear fast-forward line, so hosting platforms (Cloudways Velocity) auto-deploy on every sync. Never commit to the standalone repo directly — the next sync overwrites it.


Endpoints

RouteAuthPurpose
GET /mcppublicStreamable-HTTP discovery JSON
POST /mcpBearer keyJSON-RPC 2.0 (initialize, ping, notifications, tools/list, tools/call, resources/, prompts/)
GET /healthpublicMinimal status + per-site health registry
GET /health/fullBearer keyFull view (host-only URLs, bindings)
GET /admin/policyOperator tokenEffective policy + quota table (read-only)
POST /admin/policy-simOperator tokenReplay a candidate policy against recorded calls
GET /admin/catalogOperator tokenFleet catalog with per-site lifecycle states
GET /publicHuman landing page (directory reviewers)

Configuration (env only)

VariableRequiredPurpose
GATEWAY_PUBLIC_KEYSyesPublic keys → site slugs: key=slug-a,slug-b;key2=slug-c (or JSON object)
GATEWAY_PUBLIC_KEYS_PREVIOUSnoRotation overlap — previous key map (warns once on use)
PUBLIC_SITE_SLUGSnoPrivacy filter for the public /health endpoint: comma-separated slugs visible without auth (* or unset = all configured sites). /health/full always reports every site.
NVOOS_SITE_<SLUG>_URLper siteUpstream MCP endpoint, full URL incl. /wp-json/mcp-ai/v1/mcp
NVOOS_SITE_<SLUG>_TOKENper siteFleet Operator token (op_xxxx.SECRET); never logged or returned
AUTH_MODEnostrict (default) fails closed at boot when no keys are set
UPSTREAM_TIMEOUT_MSnoPer-site timeout for tools/list + notifications (default 20000)
UPSTREAM_TOOL_TIMEOUT_MSnotools/call budget only — long-running tools get more room without slowing tools/list (default: UPSTREAM_TIMEOUT_MS)
GATEWAY_OAUTH_ISSUERnoOAuth 2.1 authorization server issuer (e.g. Auth0 tenant). Setting it turns the gateway into an RFC 9728 protected resource — see the OAuth section below
GATEWAY_OAUTH_JWKS_URInoJWKS override (default: issuer's /.well-known/jwks.json)
GATEWAY_OAUTH_RESOURCEnoRFC 8707 resource identifier / token audience (default https://mcp.nvoos.pro)
TRUST_PROXYyes on Velocity1 — NGINX sets X-Forwarded-For
ALLOWED_ORIGINSnoComma-separated CORS origins for browser-based clients
MAX_JSON_BODYnoBody limit (default 1mb)
RATE_LIMIT_GLOBAL / _MCP / _HEALTHnoPer-group budgets (defaults 600/5min, 120/min, 60/min)
TOOL_QUOTASnoPer-tool quotas, compact form: <pattern>:<rate>/<window>:<burst> — e.g. delete_post:5/1h:2,woo_*:60/1m:*. Most-specific pattern wins. (Proposal 094)
GATEWAY_POLICYnoPolicy ruleset (JSON string) — see the policy reference below. (Proposal 094)
POLICY_FILEnoAlternative: path to a JSON policy file (Git-versioned policy, read at boot).
SHADOW_POLICYnoShadow ruleset (JSON string) — evaluated and logged, never enforced.
GEO_MAPnoJSON object mapping public key ids to ISO country codes (used when not behind a trusted proxy).
GATEWAY_ADMIN_TOKENnoOperator token enabling the /admin/* surface (inert without it).
AUDIT_SINK_URL / AUDIT_SINK_SECRETnoHMAC-signed webhook for governance events (deny, quota_exceeded, call_ok…). Must be set together.
SITE_LIFECYCLEnoPer-site catalog states: slug-a:draft,slug-b:published (default published).

Slug → env suffix mapping: site-a → NVOOS_SITE_SITE_A_* (uppercase, hyphens → underscores).

Example

env
GATEWAY_PUBLIC_KEYS=demo-public-key-1234567890=demo-siteNVOOS_SITE_DEMO_SITE_URL=https://demo.example.com/wp-json/mcp-ai/v1/mcpNVOOS_SITE_DEMO_SITE_TOKEN=op_xxxx.SECRETAUTH_MODE=strictTRUST_PROXY=1

Policy & quotas (Proposal 094)

Per-tool quotas and declarative policy ride on top of the group budgets. Sites remain the deep enforcement layer (per-tool RPM, token budgets, iteration caps, capability boundaries, nefarious-usage auto-shutdown) — the gateway adds the fleet layer and can only tighten, never weaken.

Quotas

env
TOOL_QUOTAS=delete_post:5/1h:2,woo_*:60/1m:*,*:600/5m:*

Breaches return HTTP 429 + RFC 9558 headers (RateLimit-Limit/Remaining/Reset, RateLimit-Policy) with the JSON-RPC error -32099. Buckets are scoped (key × site × tool) — one noisy key cannot exhaust another's budget.

Policy grammar

json
{  "rules": [    {      "id": "no-night-deletes",      "effect": "deny",      "tool": { "match": "delete_*" },      "time": { "window": { "tz": "Europe/London", "days": [1,2,3,4,5], "start": "09:00", "end": "17:00" } }    }  ]}

First match wins. Effects: deny (403 + -32001), require_approval (428 + -32002 with a redacted preview). Conditions: tool.match (glob), site, key, time.window (IANA tz, ISO weekdays 1–7, midnight-crossing windows), geo.country (ISO alpha-2). Denied tools are filtered out of tools/list entirely (kept out of model context).

Inspection

  • dryRun: true on tools/call evaluates policy + quotas without executing or consuming — the result carries would_execute, policy, and quota.
  • POST /admin/policy-sim replays a candidate policy against the last 200 recorded calls (argument keys only) and diffs it against the live policy.
  • SHADOW_POLICY evaluates in parallel and logs — never enforces.

Tool namespacing

  • tools/list merges every site bound to the key and prefixes names: site-a.create_post, site-b.woo_get_products.
  • tools/call accepts the prefixed name (always) or a bare name when the key is bound to exactly one site (passthrough mode).
  • A failing upstream degrades the list to a _meta.gateway.errors entry instead of failing the whole call.
  • v1 aggregation limitation: resources/* and prompts/* use the first bound site.

Behavior & security

  • Protocol negotiation: initialize echoes the highest protocol version both sides support (2026-07-28 → 2024-11-05), defaulting to 2024-11-05 when the client sends no version — strict clients (Zed, Claude Desktop) abort with "Unsupported protocol version" when the server hardcodes a version they do not speak.
  • Stateless — no sessions, no SSE in v1 (the July 2026 spec revision makes stateless transport first-class).
  • Fail-closed: no keys configured in strict mode → boot refuses; a key bound to no configured site → 503; unknown key → 401 with WWW-Authenticate.
  • Rate limits are per public key (one noisy key cannot exhaust another's budget); upstream tokens are header-only and never appear in responses, logs, or errors.
  • Auth: static API keys in v1; OAuth 2.1 (RFC 8414 + dynamic client registration) is the documented upgrade path.

Claude Code plugin

The addon ships a Claude Code plugin (.claude-plugin/plugin.json, commands/connect.md, skills/gateway/) that syncs to the mirror repo and doubles as the marketplace source:

/plugin marketplace add nvdigitalsolutions/nvoos-mcp-gateway

Enabling the plugin prompts for the gateway API key (stored securely as a sensitive userConfig option) and substitutes it into the MCP server's Authorization header.

OAuth 2.1 resource server (opt-in)

With GATEWAY_OAUTH_ISSUER set, the gateway acts as an RFC 9728 protected resource alongside static keys:

  • GET /.well-known/oauth-protected-resource (+ the /mcp path-insertion variant) serves the protected-resource metadata document (inert 404 when OAuth is unconfigured).
  • 401 responses carry WWW-Authenticate: Bearer resource_metadata="…", scope="…" so MCP clients can run the OAuth 2.1 authorization-code + PKCE flow against the configured authorization server.
  • JWT bearer tokens validate against the AS JWKS (cached, fail-closed): signature, iss, aud (RFC 8707 resource binding), exp/nbf, and scope.
  • Site binding is scope-based: each site:<slug> scope grants access to that bound site (the read-only site:read scope is advertised for future fine-grained enforcement). Tokens granting no configured site get 403 insufficient_scope.
  • Upstream proxying is unchanged: the gateway always exchanges for the site's own Fleet Operator token — OAuth tokens are never forwarded upstream (no confused-deputy passthrough).

Authorization server: any OAuth 2.1 AS with RFC 8414 metadata + JWKS (Auth0 is the platform convention). Dynamic client registration (RFC 7591) belongs to the AS, not the gateway.

Development

bash
npm installnpm test        # node:test suites — fake upstreams, no infrastructurenpm run dev     # node --watch src/index.js

Local smoke test against the docker compose dev site:

bash
GATEWAY_PUBLIC_KEYS="dev-key-1234567890abcd=docker" \NVOOS_SITE_DOCKER_URL="http://localhost:8000/wp-json/mcp-ai/v1/mcp" \NVOOS_SITE_DOCKER_TOKEN="<assistant/operator token>" \PORT=8899 npm start# → curl http://127.0.0.1:8899/mcp

Ecosystem discovery

The public endpoint https://mcp.nvoos.pro/mcp is listed in the official MCP Registry (registry.modelcontextprotocol.io) as io.github.nvdigitalsolutions/nvoos-mcp-gateway — a streamable-HTTP remote with a required Authorization header. The registry metadata lives in server.json and is published with the mcp-publisher CLI. Community directories (mcpservers.org, mcp.directory, PulseMCP, Glama) carry entries that point back here; the GET / landing page is the directory-reviewer surface.

License

GPL-3.0-or-later — see the repository LICENSE.

來源:addons/mcp-gateway/README.md,提交 a11903e

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

3
  1. v0.3.1最新Nov 4, 2026
  2. v0.3.0Nov 3, 2026
  3. v0.2.0Nov 1, 2026

評分

已滿足適用檢查項的 75%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。