
PerspectiveGraph
io.github.luiacuaniello由 GitHub 账号 luiacuaniello 发布v1.39.2更新于 Oct 29, 2026
Read-only attack-path tools: reachable routes to sensitive assets, and what a fix would cut.
概览
以只读方式通过 MCP 访问 PerspectiveGraph,查看从互联网到敏感资产的攻击路径,以及修复会切断哪些路径。
- 可以做什么
- 查询由扫描器与云状态构建的攻击路径图:通往敏感资产的可达路线,并按处置优先级排序。
- 查看单条路径的每一跳、概率及其区间,以及每个数字的来源。
- 在切断指定边后重新运行模拟,查看修复实际改变了什么(simulate_fix)。
- 读取引擎自身的准确性与校准状态,以及已记录结果的对比情况。
- 八个工具全部为只读,并在协议层声明为只读。
- 适用场景
- 适合已经运行 Trivy、Semgrep、Cloud Custodian、Falco 等扫描器并掌握 AWS 与 Kubernetes 状态的团队,让助手基于真实攻击路径推理而不是凭空编造。尤其适合判断哪一项发现真正打开了通往重要资产的路径。
- 运行要求
- 作为本地进程运行(容器镜像 ghcr.io/luiacuaniello/perspectivegraph),以 mcp 子命令启动并指向一个 PerspectiveGraph API 端点,可以是自建实例或公开演示。仅支持桌面环境。仅当 API 要求认证时才需要 API_TOKEN bearer 令牌。
安装
在 SourceWeft 中
- 打开 控制台中的 PerspectiveGraph,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
[图片] [PerspectiveGraph]
Your scanners find issues. This finds the way in.
[CI] [Latest release] [License: Apache 2.0] [OpenSSF Scorecard] [Live demo status]
PerspectiveGraph joins what you already run - Trivy, Semgrep, Cloud Custodian, Falco, plus your AWS and Kubernetes state - into one graph of your real environment, and asks a single question of it: can someone get from the internet, through privilege that is too broad, to something worth stealing?
On a pull request it asks that question before the merge: the check goes red only when this change opens a route, and the fix comes back as its own pull request. Open source (Apache 2.0), runs on your infrastructure, collects no telemetry.
[PerspectiveGraph: from the day's exploitable routes to a generated fix]
Twelve seconds of make demo: what is exploitable now → the ranked routes → one route's kill
chain and the fix it generates → whether the scores can be trusted. Sample scanner output and
seeded verdicts, not a real environment.
- See it running - the same dashboard, published read-only. Nothing to install.
- Read the documentation - the manual, one page per subject, with search.
- Check your own AWS account - one read-only command, no deployment.
- Put it on your pull requests - ten lines of YAML.
A score here is what the model concludes from the evidence it was given, not a measured frequency: nothing has been calibrated against field data yet, and the engine says so itself rather than rounding up. What is measured, and what is not.
Check your own account in 30 seconds
No deployment, no Docker, nothing ingested. One static binary asks AWS's own policy evaluator which of your roles can reach administrator - applying the service control policies, permission boundaries and condition keys that a policy reader on its own does not see:
It is read-only and free: each check is one iam:SimulatePrincipalPolicy dry run, which
creates nothing and costs nothing, and the only permissions it needs are that and
iam:ListRoles, both inside SecurityAudit. Windows builds are on the
releases page; every binary
is signed with cosign and carries SLSA provenance, and two commands
verify both before you run anything.
Add -compare and it also runs the engine over the same account, exiting non-zero where the
two disagree. That is how the engine's
first real false positive
was found, and how it stays fixed. If it disagrees on yours,
report it: no report is more useful. From here, how to evaluate this walks to a
verdict on your own estate in stages that each end in an answer.
See the whole engine in 90 seconds
Pulls the published, cosign-signed images, feeds them sample Trivy / Semgrep / Custodian /
Falco / Kubernetes / IAM / SSO output, and prints the top attack path with its generated fix.
Dashboard on http://localhost:3000, make down to tear it down. It needs Docker, jq and
curl, compiles nothing, and takes about 23 seconds from an empty image cache; make demo-build
is the same demo built from your working tree.
On Kubernetes, the chart is an official package on Artifact Hub:
On one machine - a VM with Docker and a DNS name - one command sets up TLS, generated credentials, an authenticated bus and daily backups, and starts it: production on one machine.
The chart and the three images it runs (ghcr.io/luiacuaniello/perspectivegraph, -dashboard
and -postgres) are signed with cosign keyless and carry an SPDX SBOM and SLSA provenance:
verify them rather than taking the supply chain on trust.
The dashboard opens on the decision, not the inventory: what is being exploited now, the fewest changes that remove the most risk, and how far the numbers can be trusted. Routes are ranked by triage priority - what the route reaches, whether runtime confirmed it, how exposed the entry is - so a lower-scoring route can outrank a higher-scoring one.
The screenshots are make demo with seeded verdicts: make seed-validation records
synthetic outcomes on part of the routes, the way a BAS run tests part of an estate, which is why
the calibration panel has something to show - and why it still says not enough outcomes yet:
the handful it records is far short of the 30 a verdict needs. The counts in the pictures are
those of the release they were taken on; the sample data has grown since, so yours differ by a
route or two. A fresh install and the public demo report
insufficient data instead, until real outcomes exist. The public demo runs on one free VM, so
treat it as best-effort.
Why?
A scanner reports that a container carries a critical CVE. It cannot report that the container sits behind an internet-facing load balancer, runs with a role that reads the production database, and is therefore the one finding out of ten thousand worth fixing this week. That needs the other tools' output in the same graph, which is what this builds. A developer gets a check that goes red only when their change opens a real route; a security team gets a short ranked list of attack paths instead of a flat list of findings.
Block the pull request that opens the path
No deployment required. The runner reads your estate read-only, ingests this pull request's scan, and answers in-process with the same engine:
The check goes red when this change opens a route to a sensitive asset - or makes one likelier - not when it adds a critical CVE: a critical on a host nothing routes to does not fail the build, and a medium on a container that now reaches the production database does. Routes that were there before the change do not count, even when they run through what it touches: the scan is applied to a copy of the estate and compared with it, and nothing is written. It also has a third outcome, because a pipeline whose scan never arrived must not get the same green tick as one that is clean:
A Terraform plan goes through the same gate before anything is deployed: source: terraform
with the output of terraform show -json, judged on its own or against the live estate. A
security group rule, a policy attachment or a bucket policy that opens a route fails the check
in the pull request that writes it - see Terraform plans.
Outside GitHub Actions it is one command, and it installs as a Trivy plugin too:
[!WARNING] Fork pull requests get no secrets, so the gate fails closed as
unknownon them. Do not work around it withpull_request_target: that runs your secrets - in local mode, cloud credentials - against the contributor's code.On a public repository, a blocked check prints the route (real asset names, the CVE, the sensitive asset) into a public job log. Use
soft-failand post the detail somewhere private.
The manual covers the rest:
pointing the action at a deployed engine, gating rendered manifests, a pre-collected estate,
rolling the gate out, and every input in action.yml.
Let an agent query it
A language model cannot enumerate thousands of edges reliably or run Dijkstra, and asked for "the attack paths in my account" it will invent plausible ones. So the engine speaks MCP: the agent asks, and reasons over answers it could not have made up.
Eight tools, every one read-only and declared so on the wire. The one worth the integration
is simulate_fix: it re-runs the simulation with the given edges cut and reports what actually
changes. The server is in the official MCP Registry
and on Glama; the tools and the
client configuration are in the manual.
[PerspectiveGraph MCP server on Glama]
Project status & maturity
[OpenSSF Best Practices] [Artifact Hub] [Go]
The engine and its public API are complete, documented and tested. The scores are not yet calibrated. Nobody has run this over a real estate, tested the paths it surfaced and fed the verdicts back: the machinery for that loop is built and tested, the loop is not closed. So read a score as what the model believes and how sure it says it is, not as a measured frequency. Use it to find and cut routes; don't put its percentage in front of a board. If you run it over yours, tell us how it went. Positioning spells out what is and isn't claimed.
What is measured today, as of v1.39.2.
make bench-cloudgoat grades the engine in CI on four
CloudGoat-shaped scenarios:
Precision and recall are 1.00 on all four: four known shapes, two of them negative controls, so a
regression gate rather than a measure of accuracy on your estate. On real AWS,
make reachability-lab-aws checks exposure the same way for free, and make redteam-aws grades
the engine's escalation claims against AWS's own policy evaluator. That grading has already
caught one false positive, a permissions boundary the engine ignored; it is fixed, and
make boundary-lab-aws fails whenever the engine and AWS disagree. make entrypoints-lab-aws
puts bucket policies and function URLs to AWS the same way; its first run caught four errors,
also fixed. make public-access-lab-aws does it, for free, for Block Public Access set on the
whole account, and make terraform-lab-aws applies the Terraform plans the merge gate judged and
asks the internet whether each one opened a way in. Each of these labs writes what it found
into the build, and the dashboard's Accuracy page shows it under Checked against AWS: every
question, AWS's answer, the engine's, and the version it was asked of.
- Clouds. AWS is live and verified against a real account; reading several accounts in one pass is exercised on fixtures, not yet against real ones. Azure is fixtures only, and there is no connector for GCP or for OpenStack: the roadmap says what is planned for each.
- Interface. The GraphQL schema is frozen and drift-guarded, so a breaking change comes with a major version, never in a patch: API stability.
- Deployment. The backend is distroless and non-root on a read-only root filesystem, the
images are pinned by digest, and under Helm every workload meets the
restrictedPod Security Standard, asserted in CI. The compose defaults are open on purpose;PG_ENV=productionrefuses to start unless API and ingest are authenticated. A real rollout needs more (TLS, backups,TRUSTED_PROXY_CIDRSbehind a proxy, a database you can fail over): on one machinemake prod-initdoes the first three, and CI restores one of its backups on every change; the operations runbook lists the rest. - Support. The newest release only, with a clock on security fixes (Critical 7 days, High 30): SUPPORT.md.
- Telemetry. None. Out of the box it opens no outbound connection; GitHub, the AI assistant and the KEV/EPSS feeds each stay off until you configure them.
- Scope. The reachable attack-path question, in the developer workflow. It is not a scanner, a CNAPP or a compliance product, and replaces none of them.
- How it is written. By a human working with Claude (Anthropic): the design decisions and
what ships are the maintainer's, and much of the implementation and its tests came out of that
collaboration. Check it rather than trust it:
make test,make bench-cloudgoat,govulncheck ./..., and CONTRIBUTING.
Documentation
- Concepts in plain words - route, score, interval, priority, outcome, calibration: the words the dashboard uses
- Connect your own infrastructure - your AWS accounts and Kubernetes clusters, from a laptop, one machine, EKS or any cluster
- Manual - architecture, scoring, every integration, deployment, and the runbook for your own environment
- Evaluation - trying it on your own estate, in stages that each end in an answer
- Positioning - what is claimed, what is not, and how to check
- Operations · Threat model · Scale · API stability
- Support · Releases · Upgrading · Roadmap · Security
- Contributing · Governance · Maintainers · Adopters
License
Apache License 2.0. Licensing is declared for every file, in the form REUSE defines, and checked in CI: REUSE.toml.
来源:README.md,提交 10115ab
工具
0版本历史
36- v1.39.2最新Oct 29, 2026
- v1.39.1Oct 24, 2026
- v1.39.0Oct 21, 2026
- v1.38.2Oct 19, 2026
- v1.38.1Oct 14, 2026
- v1.38.0Oct 12, 2026
- v1.37.0Oct 10, 2026
- v1.36.0Oct 9, 2026
- v1.35.1Oct 9, 2026
- v1.35.0Oct 8, 2026
- v1.34.0Oct 7, 2026
- v1.33.1Oct 7, 2026
- v1.33.0Oct 7, 2026
- v1.32.0Oct 5, 2026
- v1.31.0Oct 4, 2026
- v1.30.0Oct 3, 2026
- v1.29.1Oct 2, 2026
- v1.28.3Oct 2, 2026
- v1.28.1Oct 1, 2026
- v1.27.2Oct 1, 2026
- v1.27.1Sep 30, 2026
- v1.26.0Sep 30, 2026
- v1.25.1Sep 27, 2026
- v1.25.0Sep 27, 2026
- v1.24.0Sep 26, 2026
- v1.21.0Sep 25, 2026
- v1.20.0Sep 25, 2026
- v1.19.0Sep 24, 2026
- v1.18.1Sep 22, 2026
- v1.18.0Sep 22, 2026
- v1.17.0Sep 19, 2026
- v1.16.1Sep 17, 2026
- v1.16.0Sep 17, 2026
- v1.14.4Sep 17, 2026
- v1.14.3Sep 16, 2026
- v1.14.1Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分

