GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者提供的说明(英文原文)
Authorization answers from real policy code: evaluate Rego locally, or ask an AuthZEN 1.0 PDP.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
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/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"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .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 envAUTHZEN_PDP_TIMEOUT envMCP_OPA_EVAL_TIMEOUT envMCP_OPA_ALLOW_NETWORK_BUILTINS env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日
注册名称已通过 GitHub 账户 kanywst 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 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
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
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
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
| Tool | Answers | Needs |
|---|---|---|
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_batch | The 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.
opa eval in a shell toolAn agent given shell access can already run opa eval. What it cannot do is get an answer it is allowed to trust:
[]. 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.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.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.permit_on_first_permit legitimately returns fewer decisions than you sent. Zipping the arrays would attach a decision to the wrong resource.results: [] means nothing is permitted; a response with no results member, or a result of the wrong entity type, is an error.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" }
evaluate_policy| Param | Required | Description |
|---|---|---|
rego | yes | Rego source with a package declaration. |
query | yes | Rego query, e.g. data.example.allow. |
input_json | no | JSON-encoded input document. |
data_json | no | JSON-encoded base document for the data namespace. |
rego_version | no | v1 (default) or v0 for pre-OPA-1.0 syntax. |
trace | no | Return 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| Param | Required | Description |
|---|---|---|
subject | yes | JSON object. AuthZEN requires type and id. |
action | yes | JSON object. AuthZEN requires name. |
resource | yes | JSON object. AuthZEN requires type and id. |
context | no | JSON object with runtime context (IP, time, MFA strength). |
pdp_url | no | Override 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_batchSame 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_searchThe AuthZEN Search APIs. search picks which entity is being listed; that entity carries only its type.
search | Asks | subject | action | resource |
|---|---|---|---|---|
subject | Who may do this to that resource? | type only | required | type and id |
resource | Which resources of a type may the subject act on? | type and id | required | type only |
action | What may the subject do to the resource? | type and id | must be omitted | type 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_discoverFetches /.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.
Implements Authorization API 1.0, approved as an OpenID Final Specification in January 2026:
| Section | Status |
|---|---|
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 model | Required members validated before the request is sent |
X-Request-ID correlation | Sent 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.
| Variable | Default | Description |
|---|---|---|
AUTHZEN_PDP_URL | — | Default Access Evaluation endpoint. |
AUTHZEN_PDP_TOKEN | — | Authorization header value. A value with no scheme is sent as Bearer . |
AUTHZEN_PDP_TIMEOUT | 10s | Per-request timeout. |
AUTHZEN_PDP_MAX_RESPONSE_BYTES | 1048576 | Response read limit. |
MCP_OPA_EVAL_TIMEOUT | 5s | Wall-clock limit on one Rego evaluation. |
MCP_MAX_ARG_BYTES | 1048576 | Per-argument size limit. |
MCP_OPA_ALLOW_NETWORK_BUILTINS | false | Re-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.
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-in | Why |
|---|---|
http.send | Arbitrary 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_addr | Enough to exfiltrate input one DNS label at a time, with no port reachable. |
opa.runtime | Returns 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)
只显示了开头部分;其余内容请在仓库中阅读