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 分

    请在仓库或注册中心条目中声明许可证。