原型 · 预览版:收录官方注册中心里的全部服务器,每 30 分钟同步一次。评价和账户功能将在后续阶段推出。
PopNx MCP为使用 AI 的人准备的 MCP 服务器 · 用大白话讲清楚

MCP Opa Authz

作者:kanywst版本 0.6.2i★ –i在你的电脑上运行
注册名称io.github.kanywst/mcp-opa-authz

安装

概览

作者提供的说明(英文原文)

Authorization answers from real policy code: evaluate Rego locally, or ask an AuthZEN 1.0 PDP.

PopNx MCP 的三大支柱

这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。

它能帮你做什么

我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。

  • 连接方式: 在你的电脑上运行
  • 传输方式: stdio
  • 分类: 开发者工具
  • 你需要填写:AUTHZEN_PDP_TOKEN

安装

选择你使用的 AI 应用,然后复制设置。

安装之前

  • 基础检查:1 项中通过 1 项
  • 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
  • 需要你自己填写: AUTHZEN_PDP_URL, AUTHZEN_PDP_TOKEN, AUTHZEN_PDP_TIMEOUT, MCP_OPA_EVAL_TIMEOUT, MCP_OPA_ALLOW_NETWORK_BUILTINS

标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。

你需要

你用的是哪个应用?

在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。

打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json

{
  "mcpServers": {
    "opa-authz": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "AUTHZEN_PDP_URL",
        "-e",
        "AUTHZEN_PDP_TOKEN",
        "-e",
        "AUTHZEN_PDP_TIMEOUT",
        "-e",
        "MCP_OPA_EVAL_TIMEOUT",
        "-e",
        "MCP_OPA_ALLOW_NETWORK_BUILTINS",
        "ghcr.io/kanywst/mcp-opa-authz:0.6.2"
      ],
      "env": {
        "AUTHZEN_PDP_URL": "your-value",
        "AUTHZEN_PDP_TOKEN": "your-value",
        "AUTHZEN_PDP_TIMEOUT": "your-value",
        "MCP_OPA_EVAL_TIMEOUT": "your-value",
        "MCP_OPA_ALLOW_NETWORK_BUILTINS": "your-value"
      }
    }
  }
}

在终端中运行这条命令

claude mcp add opa-authz --env AUTHZEN_PDP_URL=your-value --env AUTHZEN_PDP_TOKEN=your-value --env AUTHZEN_PDP_TIMEOUT=your-value --env MCP_OPA_EVAL_TIMEOUT=your-value --env MCP_OPA_ALLOW_NETWORK_BUILTINS=your-value -- docker run -i --rm -e AUTHZEN_PDP_URL -e AUTHZEN_PDP_TOKEN -e AUTHZEN_PDP_TIMEOUT -e MCP_OPA_EVAL_TIMEOUT -e MCP_OPA_ALLOW_NETWORK_BUILTINS ghcr.io/kanywst/mcp-opa-authz:0.6.2

运行前请先填写空着的值。

在 Cursor 中打开

或者自己复制设置

粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json

{
  "mcpServers": {
    "opa-authz": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "AUTHZEN_PDP_URL",
        "-e",
        "AUTHZEN_PDP_TOKEN",
        "-e",
        "AUTHZEN_PDP_TIMEOUT",
        "-e",
        "MCP_OPA_EVAL_TIMEOUT",
        "-e",
        "MCP_OPA_ALLOW_NETWORK_BUILTINS",
        "ghcr.io/kanywst/mcp-opa-authz:0.6.2"
      ],
      "env": {
        "AUTHZEN_PDP_URL": "your-value",
        "AUTHZEN_PDP_TOKEN": "your-value",
        "AUTHZEN_PDP_TIMEOUT": "your-value",
        "MCP_OPA_EVAL_TIMEOUT": "your-value",
        "MCP_OPA_ALLOW_NETWORK_BUILTINS": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

在 VS Code 中打开

或者自己复制设置

粘贴到项目中的 .vscode/mcp.json

{
  "servers": {
    "opa-authz": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "AUTHZEN_PDP_URL",
        "-e",
        "AUTHZEN_PDP_TOKEN",
        "-e",
        "AUTHZEN_PDP_TIMEOUT",
        "-e",
        "MCP_OPA_EVAL_TIMEOUT",
        "-e",
        "MCP_OPA_ALLOW_NETWORK_BUILTINS",
        "ghcr.io/kanywst/mcp-opa-authz:0.6.2"
      ],
      "env": {
        "AUTHZEN_PDP_URL": "your-value",
        "AUTHZEN_PDP_TOKEN": "your-value",
        "AUTHZEN_PDP_TIMEOUT": "your-value",
        "MCP_OPA_EVAL_TIMEOUT": "your-value",
        "MCP_OPA_ALLOW_NETWORK_BUILTINS": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。

你的选择通过 Cookie 保存在这台设备上,无需账户。

需要你填写的值

  • AUTHZEN_PDP_URL env
    Default AuthZEN Access Evaluation endpoint, e.g. https://pdp.example.com/access/v1/evaluation. Only evaluate_policy works without it.
  • AUTHZEN_PDP_TOKEN 机密 env
    Authorization header value for the PDP. A value with no scheme is sent as "Bearer ".
  • AUTHZEN_PDP_TIMEOUT env
    Per-request timeout for PDP calls, as a Go duration. Default 10s.
  • MCP_OPA_EVAL_TIMEOUT env
    Wall-clock limit on a single Rego evaluation, as a Go duration. Default 5s.
  • MCP_OPA_ALLOW_NETWORK_BUILTINS env
    Re-enable http.send, net.lookup_ip_addr and opa.runtime inside evaluated policies. Off by default: policy source evaluated here comes from a model and runs inside the server process.

这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。

它能做什么

它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。

基础检查i

我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日

  • ✓ 通过

    作者与仓库一致

    注册名称已通过 GitHub 账户 kanywst 验证,该账户拥有此仓库

  • … 尚未检查

    仍在维护

    我们还没有从 GitHub 读取这个仓库

  • … 尚未检查

    有许可证

    我们还没有从 GitHub 读取这个仓库

  • – 不适用

    端点有响应

    它在你的电脑上运行,没有互联网端点

  • – 不适用

    使用 OAuth 登录

    在你的电脑上运行,改用本地设置

  • … 尚未检查

    工具描述中没有隐藏指令

    它在你的电脑上运行;我们只能读取互联网端点的工具列表

与“开发者工具”中的其他服务器比较i

  • 星标数多于此分类中其他 4928 个服务器的 0%
  • 发布到注册中心的时间比此分类中其他 4928 个服务器的 73% 更新
  • 基础检查结果等于或优于此分类中其他 4928 个服务器的 100%

与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。

常见问题

MCP Opa Authz 安全吗?

它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。

它需要哪些密钥或代码?

你需要填写:AUTHZEN_PDP_TOKEN

它在我的电脑上运行还是在云端?

它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。

它还在维护吗?

GitHub 仓库最后更新于–,最新版本(0.6.2)于14天前进入注册中心。

哪些应用可以使用它?

支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Docker。

有什么可以替代它?

同一分类中有:GitHub, Desktop Commander, Cloudflare MCP

替代选择

同一分类中其他作者的服务器,按星标数排序。

如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i

GitHub

Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.

作者:github广泛使用★ 3.4万5天前更新

电脑或云端

Desktop Commander

MCP server for terminal commands, file operations, and process management

作者:wonderwhy-er广泛使用↓ 71万/周★ 1万17天前更新

在你的电脑上运行

Cloudflare MCP

Cloudflare MCP servers

作者:cloudflare正在增长★ 444614个月前更新

在云端运行✓ mcp.cloudflare.com

作者的 README

打开 README

按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。

mcp-opa-authz

Stop letting your agent guess at authorization. This is an MCP server that answers "is this allowed?" from real policy code — either Rego you hand it, or the OpenID AuthZEN 1.0 PDP that actually governs your system.

Ask a model whether Alice may delete that document and it will produce a confident, plausible, unfalsifiable answer. Give it these tools and the answer comes from the policy.

brew install kanywst/tap/mcp-opa-authz

or, without Homebrew:

go install github.com/kanywst/mcp-opa-authz@latest

claude mcp add opa-authz -- mcp-opa-authz

That is enough for evaluate_policy. Point it at a PDP to get the rest:

claude mcp add opa-authz \

--env AUTHZEN_PDP_URL=http://localhost:8181/access/v1/evaluation \ -- mcp-opa-authz

Two layers, same question

ToolAnswersNeeds
evaluate_policy"What does this Rego say?" Evaluated in-process by OPA.Nothing external
authzen_evaluate"What does the PDP that governs this system say?"A reachable PDP
authzen_evaluate_batchThe same, over a list — which of these may the subject touch?A reachable PDP
authzen_search"Who may…", "which resources may…", "what may…" — the PDP lists what is permitted.A PDP with the Search APIs
authzen_discover"Which endpoints does this PDP offer?"A reachable PDP

Use evaluate_policy while authoring or debugging a policy you have the source of. Use authzen_evaluate when the decision has to come from production, not from a policy pasted into the chat. The server's MCP instructions tell the model the same thing, so it usually picks correctly on its own.

What makes this different from opa eval in a shell tool

An agent given shell access can already run opa eval. What it cannot do is get an answer it is allowed to trust:

  • Undefined is not false. A Rego query with no matching rule and no default returns []. Every model reads that as a deny. evaluate_policy returns defined alongside value, so "the policy denied" and "the policy has no opinion" stop being the same answer.
  • A PDP that did not answer is not a deny. AuthZEN makes decision a required member. A response missing it decodes into a Go bool as false — a broken PDP would look like a strict one. This server treats a missing decision as a failure, never as a deny. Same for a 401: that means *this server* failed to authenticate, not that the subject was denied, and the error says so.
  • The policy runs in a sandbox. Rego handed to an MCP server was written by a model, from text that may have come from a web page. OPA's http.send would let that policy make arbitrary HTTP requests from your laptop, and opa.runtime() would hand it your environment. Both are compiled out. See Security.
  • Batch decisions carry their index. permit_on_first_permit legitimately returns fewer decisions than you sent. Zipping the arrays would attach a decision to the wrong resource.
  • An empty search is not a failed search. results: [] means nothing is permitted; a response with no results member, or a result of the wrong entity type, is an error.

Demo

Debugging a policy that is denying when it should not:

> Why is bob getting denied on doc-1? Here's the policy and the input.

evaluate_policy(rego=…, query="data.rbac.allow", input_json=…, trace=true)

{ "defined": true, "value": false, "printed": ["checking roles for", "bob"], "trace": [ "Enter data.rbac.allow", "| Eval some role in roles[input.user]", "| Fail roles[\"bob\"]", … ] }

Bob has no entry in roles at all — the rule never reaches the permission check. Adding "bob": {"viewer"} fixes it.

Then confirming against the PDP that actually runs:

> Does production agree?

authzen_evaluate(subject={"type":"user","id":"bob"}, …)

{ "decision": false, "context": { "reason": "no role binding" }, "request_id": "3f9c…", "pdp_url": "https://pdp.internal/access/v1/evaluation" }

Tools

evaluate_policy
ParamRequiredDescription
regoyesRego source with a package declaration.
queryyesRego query, e.g. data.example.allow.
input_jsonnoJSON-encoded input document.
data_jsonnoJSON-encoded base document for the data namespace.
rego_versionnov1 (default) or v0 for pre-OPA-1.0 syntax.
tracenoReturn a pretty-printed evaluation trace. Verbose; bounded at 4000 events, 200 lines, 1 KiB per line.

Returns defined, value, the raw OPA result_set (omitted with result_set_omitted past 256 KiB encoded), any print() output (200 lines of 1 KiB), and the trace when asked for.

authzen_evaluate
ParamRequiredDescription
subjectyesJSON object. AuthZEN requires type and id.
actionyesJSON object. AuthZEN requires name.
resourceyesJSON object. AuthZEN requires type and id.
contextnoJSON object with runtime context (IP, time, MFA strength).
pdp_urlnoOverride AUTHZEN_PDP_URL for this call.

Returns decision, the PDP's context if any, the pdp_url that answered, and the request_id sent as X-Request-ID — so a decision in a transcript can be found in the PDP's logs.

authzen_evaluate_batch

Same arguments, plus evaluations (a JSON array whose entries override the top-level defaults) and evaluations_semantic (execute_all, deny_on_first_deny, permit_on_first_permit). Capped at 100 entries per call. Without pdp_url, the endpoint is the access_evaluations_endpoint the PDP advertises in its metadata, or /access/v1/evaluations under the root of AUTHZEN_PDP_URL when it advertises none — the same resolution, cache and same-origin rule as authzen_search. endpoint_source in the result says which was used.

{

"subject": "{\"type\":\"user\",\"id\":\"alice\"}", "action": "{\"name\":\"read\"}", "evaluations": "[{\"resource\":{\"type\":\"doc\",\"id\":\"1\"}},{\"resource\":{\"type\":\"doc\",\"id\":\"2\"}}]" }

authzen_search

The AuthZEN Search APIs. search picks which entity is being listed; that entity carries only its type.

searchAskssubjectactionresource
subjectWho may do this to that resource?type onlyrequiredtype and id
resourceWhich resources of a type may the subject act on?type and idrequiredtype only
actionWhat may the subject do to the resource?type and idmust be omittedtype and id

context, pdp_url, page_limit and page_token are optional. Without pdp_url, the endpoint is the one the PDP advertises in its metadata (search_subject_endpoint etc.), as the specification requires, falling back to the default path (/access/v1/search/{subject,resource,action}) under the root of AUTHZEN_PDP_URL when it has no usable metadata. The metadata is cached per PDP for five minutes, and endpoint_source in the result says which one was used. An advertised endpoint has to be on the PDP's own origin, because the PDP token goes with the request; a cross-origin one is refused unless passed explicitly as pdp_url. Returns results, has_more and next_page_token; pass the token back as page_token, with every other argument unchanged, for the next page. A response whose page object has no next_token is an error even though the specification's own example has one: without it nothing says whether the list is complete.

{

"search": "resource", "subject": "{\"type\":\"user\",\"id\":\"alice\"}", "action": "{\"name\":\"read\"}", "resource": "{\"type\":\"document\"}" }

authzen_discover

Fetches /.well-known/authzen-configuration from a PDP root. pdp_url may be a root or an evaluation endpoint — the known AuthZEN path suffix is stripped. For a PDP mounted under a prefix, the well-known string goes between the host and the prefix, as RFC 8615 and the specification place it (https://gw.example.com/.well-known/authzen-configuration/pdp); the older appended form (…/pdp/.well-known/authzen-configuration) is tried if that 404s. A document whose policy_decision_point is not the root it was fetched from is rejected, as the specification requires.

Standards conformance

Implements Authorization API 1.0, approved as an OpenID Final Specification in January 2026:

SectionStatus
Access Evaluation (POST /access/v1/evaluation)authzen_evaluate
Access Evaluations, batch (POST /access/v1/evaluations)authzen_evaluate_batch
PDP Metadata (GET /.well-known/authzen-configuration)authzen_discover
Subject / Action / Resource information modelRequired members validated before the request is sent
X-Request-ID correlationSent on every call, returned in the result
Search APIs (subject / resource / action, with pagination)authzen_search

Related work worth knowing about: the AuthZEN working group's COAZ profile binds AuthZEN to MCP tool calls themselves, so a gateway can authorize tools/call with an x-authzen-mapping declared in a tool's inputSchema. That is the enforcement side of the same problem — this server is the *inspection* side, and the two compose.

Configuration

VariableDefaultDescription
AUTHZEN_PDP_URL—Default Access Evaluation endpoint.
AUTHZEN_PDP_TOKEN—Authorization header value. A value with no scheme is sent as Bearer .
AUTHZEN_PDP_TIMEOUT10sPer-request timeout.
AUTHZEN_PDP_MAX_RESPONSE_BYTES1048576Response read limit.
MCP_OPA_EVAL_TIMEOUT5sWall-clock limit on one Rego evaluation.
MCP_MAX_ARG_BYTES1048576Per-argument size limit.
MCP_OPA_ALLOW_NETWORK_BUILTINSfalseRe-enable the network built-ins. See below.

A malformed value stops the server at startup rather than being silently replaced by the default — a bound an operator believes is in place should be in place.

Security

evaluate_policy compiles and runs Rego that a model produced, inside this process. Three OPA built-ins are removed from the capability set for that reason:

Built-inWhy
http.sendArbitrary HTTP from wherever the server runs — a laptop or CI runner, inside whatever network boundary that sits behind. It is the whole SSRF surface, and it contradicts the tool's own description.
net.lookup_ip_addrEnough to exfiltrate input one DNS label at a time, with no port reachable.
opa.runtimeReturns the runtime configuration, including the process environment and every credential in it.

Time, JWT, UUID and random built-ins are untouched — those appear in real authorization policies. A policy using a removed built-in fails to compile with a message naming it, and pointing at MCP_OPA_ALLOW_NETWORK_BUILTINS for the cases where you genuinely want it.

The PDP client is constrained too: pdp_url must be an absolute http(s)

只显示了开头部分;其余内容请在仓库中阅读

问 PopNx