TikyParkinson/mcp-agent-guardrails-spring-boot-starter

GitHub: TikyParkinson/mcp-agent-guardrails-spring-boot-starter

为 Java/Spring Boot 应用中 MCP 智能体的工具调用提供审计、授权、提示注入检测、速率限制等安全护栏的零配置 Spring Boot Starter。

Stars: 2 | Forks: 0

# MCP Agent Guardrails [![Maven Central](https://img.shields.io/maven-central/v/io.github.tikyparkinson/mcp-guardrails-spring-boot-starter.svg?label=Maven%20Central)](https://central.sonatype.com/artifact/io.github.tikyparkinson/mcp-guardrails-spring-boot-starter) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/TikyParkinson/mcp-agent-guardrails-spring-boot-starter/actions/workflows/ci.yml) [![CodeQL](https://static.pigsec.cn/wp-content/uploads/repos/cas/53/539e9a6bf48ad24469a4363bff3aa68124154549e26592783d3d8577f2acbbfc.svg)](https://github.com/TikyParkinson/mcp-agent-guardrails-spring-boot-starter/actions/workflows/codeql.yml) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) MCP Agent Guardrails 帮助您在 Java / Spring Boot 应用中以极其简单的方式围绕 [MCP](https://modelcontextprotocol.io) 工具调用建立安全与治理控制。每次工具调用在执行前都会经过一系列护栏链条 —— 包括审计、 授权、prompt 注入检测和速率限制。 当您将 MCP 工具暴露给 LLM 代理时,“客户端”是一个自行决定调用什么以及使用哪些参数的模型。本项目填补了由此产生的四个缺口。 我们的主要目标是: * **零配置**即可运行:只需添加一个依赖,所有四个护栏就会启用,并带有合理的内存默认值。 * 坚持己见,但不碍事:每个存储、策略源和规则集都是一个端口(port)—— 只需暴露您自己的 bean,默认配置就会自动让步。 * **默认拒绝(Fail closed)**:损坏的护栏或审计存储绝不会默默放行任何调用。 * 绝不持久化工具参数(存在 PII/敏感信息泄露风险)—— 审计跟踪仅携带元数据。 ## 模块 | 模块 | 描述 | |---|---| | [guardrails-core](guardrails-core) | 共享模型、`Guardrail` 和 `ResultGuardrail` SPI、入站和出站链条,以及 MCP 工具调用拦截器 | | [guardrails-audit](guardrails-audit) | 工具调用的审计跟踪 + 其他护栏使用的审计总线 | | [guardrails-authz](guardrails-authz) | 声明式代理→工具授权策略(首次匹配优先规则) | | [guardrails-injection-guard](guardrails-injection-guard) | 基于规则对工具参数进行 prompt 注入检测 | | [guardrails-ratelimit](guardrails-ratelimit) | 针对(代理,工具)对的固定窗口速率限制 | | [guardrails-tool-integrity](guardrails-tool-integrity) | 对每个工具定义采用首次使用信任(Trust-on-first-use)的指纹记录,阻止工具投毒(tool-poisoning)式的暗中替换 | | [guardrails-credential-leak-guard](guardrails-credential-leak-guard) | 检测工具参数中的凭据,并对工具返回的凭据进行脱敏 | | [guardrails-egress-control](guardrails-egress-control) | 针对具备网络能力的工具的出站目标允许列表,默认为空 | | [guardrails-anomaly-detector](guardrails-anomaly-detector) | 如果代理的近期历史记录看起来像是在循环,或者在其从未使用过的工具中进行扫描,则对其进行升级处理 | | [guardrails-approval-gate](guardrails-approval-gate) | 暂挂升级后的调用,直到人员批准或拒绝;保持沉默等同于拒绝 | | [guardrails-trifecta-correlator](guardrails-trifecta-correlator) | 当私密数据、不受信任的内容和出站通信三者在一个会话中交汇时,对该会话进行升级处理 | | [spring-boot-starter](spring-boot-starter) | 将所有内容组装在一起的自动配置 —— 即您需要导入的构件 | ## 安装与入门 添加该 starter —— 这就是您需要做的全部操作: ``` io.github.tikyparkinson mcp-guardrails-spring-boot-starter 0.2.0 ``` 您的 MCP 服务器中的任何 `SyncToolSpecification` bean 都会被自动装饰;您无需更改 注册工具的方式。被拒绝的调用将返回一个 `isError` 的 MCP 结果,并且工具永远不会运行。 ### 开箱即用 在无任何配置的情况下,全部十一个模块都会加载,并且它们中的每一个都处于允许状态:那些 需要策略的护栏会从一个空策略开始,因此升级版本绝不会开始拒绝您之前已经成功进行的调用。您将立即获得审计跟踪、工具定义基准和异常历史记录; 随着您声明工具的具体功能,其余的护栏也会开始为您保驾护航。 有两件事值得特意开启,因为它们正是整个链条大部分推理的基础: - **哪些工具会与外部通信**,针对 `egress-control` - **每个工具能做什么**,针对 `trifecta-correlator` ### 配置模块 每个模块都有其自己的前缀和 `enabled` 标志。请注意,有三个前缀比模块名称短:`egress`、`anomaly` 和 `trifecta`。 ``` mcp: guardrails: enabled: true # master switch; false disables everything authz: # who may call what default-effect: DENY rules: - { agent: "prod-agent", tool: "*", effect: ALLOW } - { agent: "*", tool: "drop_database", effect: ESCALATE } tool-integrity: # trust on first use; blocks rug-pulls on-mismatch: DENY on-unknown-definition: ALLOW injection-guard: # prompt injection in tool arguments built-in-rules-enabled: true credential-leak: # secrets in arguments, and in what tools return on-confirmed-input: DENY on-suspected-input: ESCALATE on-output-text: REDACT egress: # where tools are allowed to send data on-violation: DENY allowed-destinations: ["api.internal.example.com"] tools: - { name: "http_post", destination-arguments: ["url"] } anomaly: # loops and sweeps in recent history window: PT1M repeat-threshold: 5 novel-tool-threshold: 3 trifecta: # private data + untrusted content + egress in one session session-idle-timeout: PT30M session-max-duration: PT2H tools: - { name: "read_customer", capabilities: [PRIVATE_DATA] } - { name: "fetch_page", capabilities: [UNTRUSTED_CONTENT] } - { name: "send_email", capabilities: [EXTERNAL_COMMS] } approval: # holds an escalated call until a person decides timeout: PT2M max-pending: 20 ratelimit: max-invocations: 60 window: PT1M audit: in-memory-max-events: 1000 ``` 将模块的 `enabled: false` 设置为 false 会将其护栏从链条中移除,并保持其余部分 继续运行。每个模块的 README 文档都记录了其完整的属性列表及其可插拔的端口。 ### 调用如何被评估 护栏以固定的顺序运行,并且**它们全部始终参与评估**,因此即使第一个护栏已经拒绝了调用,您也能获得完整的决策跟踪: ``` audit → tool-integrity → authz → injection-guard → credential-leak → egress-control → anomaly-detector → trifecta-correlator → ratelimit ``` `audit` 最先运行,因此被拒绝的调用仍会被记录;`ratelimit` 最后运行,因此较早被拒绝的调用不会消耗配额。判定的优先级组合规则为 `Deny > Escalate > Allow`。 工具返回后,第二条链条会检查响应 —— 目前 `credential-leak` 会对工具放在其自身输出中的机密信息进行脱敏。 ### 升级处理需要去向 `Escalate`(升级)判定并不是一种拒绝:它是一个请求人工决策的申请。 [guardrails-approval-gate](guardrails-approval-gate) 会暂挂调用,直到有人批准或 拒绝它,而保持沉默即视为拒绝。它默认位于 classpath 中,但它需要一个通道:starter 将 `ResolveApprovalUseCase` 作为 bean 发布,供您注入到自己的 controller 中,且其本身不附带任何 HTTP endpoint。该 endpoint 决定了谁有权解除限制,因此请像保护核心特权接口一样保护它。 如果不存在 `EscalationResolver`,升级处理将向代理返回一个错误 —— 即默认拒绝(fail-closed), 但其表现与普通失败毫无区别。Starter 正会在启动时针对这种情况发出警告。 ## 获取帮助 * 查看上面链接的各个模块的 README —— 每个文档都详细说明了配置属性以及如何 替换默认适配器。 * 阅读 [ARCHITECTURE.md](ARCHITECTURE.md),这是项目的最高准则:包含六边形架构规则、 质量门禁以及完成定义(Definition of Done)。 * 正式的规范文档位于 [docs/specs](docs/specs) 中 —— 每个模块包含一份规范以及一份批准记录 (`*-DONE.md`)。 * 在 [github.com/TikyParkinson/mcp-agent-guardrails-spring-boot-starter/issues](https://github.com/TikyParkinson/mcp-agent-guardrails-spring-boot-starter/issues) 报告 bug。 ## 报告问题 * 在记录 bug 之前,请先在 issue 跟踪器中搜索,看看是否已经有人报告过 该问题。 * 请提供尽可能多的信息:项目版本、JVM 版本、MCP SDK 版本,如果可能的话,请提供一个能复现 该问题的测试用例。 ## 从源码构建 您需要 JDK 25 和 Docker(audit 和 ratelimit 模块会通过 Testcontainers 针对真实的 PostgreSQL 运行集成测试)。 ``` $ mvn verify ``` 除非一切正常,否则 `mvn verify` 会导致构建失败:包含 163 个测试用例、每个模块的 Jacoco 覆盖率(行和分支)≥ 80%(目前在所有六个模块上均为 100%/100%)、要求通过 Spotless 格式化和 Checkstyle 检查。 CI 会在每次 push 和 pull request 时运行相同的命令 ([ci.yml](.github/workflows/ci.yml));发布版本则是从 `v*.*.*` 标签推送到 Maven Central ([release.yml](.github/workflows/release.yml))。 ## 许可证 MCP Agent Guardrails 是开源软件,基于 [Apache 2.0 许可证](LICENSE) 发布。
标签:AI安全, Chat Copilot, JS文件枚举, MCP, Spring Boot, Streamlit, 域名枚举, 审计日志, 测试用例, 访问控制, 配置错误, 零日漏洞检测