mcpField
B
bounded-tools-mcp

bounded-tools-mcp

本地服务
bounded.tools安全07 周前更新

关于 bounded-tools-mcp

bounded-tools-mcp 是面向 bounded.tools 的本地只读 MCP 服务及配套 CLI。它仅公开选定的 JSON 文件,并在返回前将文件字节与 SHA-256 清单核对,还可选进行 Sigstore 签名验证。

主要功能

  1. 01只读 MCP 工具和 CLI
  2. 02逐字节 SHA-256 校验
  3. 03可选的 Sigstore 清单验证
  4. 04一致性报告和 SPDX SBOM
  5. 05提供已验证的网站元数据资源

适用场景

  1. 01获取 Web-Build 一致性报告
  2. 02读取网站的 SPDX 软件物料清单
  3. 03使用前验证 bounded.tools 的 JSON

MCP 相关

通过本地 stdio 运行,提供 `get_conformance` 和 `get_sbom` 工具,以及一致性报告、SBOM 和 web manifest 资源。返回内容在交付前会与网站的 SHA-256 签名清单核对。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"bounded-systems-bounded-tools": {
"command": "npx",
"args": [
"-y",
"@bounded-systems/bounded-tools-mcp"
],
"env": {
"BOUNDED_TOOLS_MCP_SIGNATURE_MODE": "<BOUNDED_TOOLS_MCP_SIGNATURE_MODE>"
}
}
}
}
启动命令npx -y @bounded-systems/bounded-tools-mcp
需要配置的环境变量
BOUNDED_TOOLS_MCP_SIGNATURE_MODEManifest Sigstore signature check: off | warn | require.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@bounded-systems/bounded-tools-mcp0.1.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

@bounded-systems/bounded-tools-mcp

一个本地、只读的 MCP 服务(以及与之配套的 CLI),用于访问 bounded.tools 的已签名静态 API。

它向任何 MCP 客户端(Claude Desktop、Claude Code 等)公开网站以可验证、内容寻址的 JSON形式提供的部分内容——Web-Build Conformance 报告和 SPDX SBOM——并在返回前,针对网站经 Sigstore 签名的 sha256 清单逐字节验证每个响应。如果客户端将收到的字节与已签名清单不匹配,它就会拒绝返回这些内容。

它通过 stdio 在本地运行——客户端以子进程形式启动它。它没有托管服务,也没有网络监听器,因此保留了网站的静态 / 无攻击面的特性。

通用核心的精简实现

这个包十分精简。所有可复用的机制——验证型 fetch 客户端、sha256 清单与 Sigstore 检查,以及 VerbSpec → MCP(工具 + 资源) / VerbSpec → CLI 投影——都位于 @bounded-systems/static-mcp 中。bounded-tools-mcp 仅提供:

src/verbs.ts ─┐
src/catalog.ts ├─▶ buildToolsSpec(config) ─▶ @bounded-systems/static-mcp
src/config.ts ─┘        serveVerifiedStaticMcp(spec, config)   (MCP, stdio)
                        runStaticCli(spec, config, argv)        (CLI)

两种接口,一个定义。 verbspec 会将每个动词投影为一个 MCP 工具和一个 CLI 子命令。MCP 工具和 CLI 命令由完全相同的一组动词提供支持——无需重复定义,也不会产生偏差。

公开的内容(以及未公开的内容)

bounded.tools 是一个静态网站,其可验证接口有意保持精简。这里仅公开网站以已签名、内容寻址的 JSON形式提供的内容——每项内容都会被获取,并针对已签名清单逐字节验证:

提供形式内容是否公开
已签名 JSONapi/v1/conformance.json✅ get_conformance · tools://conformance
已签名 JSONsbom.spdx.json✅ get_sbom · tools://sbom
已签名 JSONsite.webmanifest✅ tools://webmanifest(仅资源)
已签名的 HTML + Markdown博客(blog/*.html、blog/*.md)❌ 不是 JSON — 见下文

诚实优先,不盲目扩大接口。 博客确实包含在已签名清单中,但它以 HTML + Markdown 形式提供,而非 JSON 订阅源或单篇文章的 JSON 文档。经过验证的静态核心会获取每项内容并将其解析为 JSON,因此将博客公开为“工具”就意味着要捏造网站实际上并未提供的 JSON 结构。因此,我们选择不公开,而不是伪造。如果 bounded.tools 日后发布已签名的 posts.json(以及每篇文章的 JSON),就能直接加入 list_posts / get_post 动词,方式与 site-mcp 完全相同。

安装 / 运行

需要 Node ≥ 18.17。verbspec 依赖发布在 JSR 上,因此安装时会通过 JSR 的 npm 桥接服务解析该依赖——随附的 .npmrc 设置了 @jsr:registry=https://npm.jsr.io。(在全新的环境中使用时,请将这一行添加到 npm 配置中。)

# MCP server over stdio (what an MCP client launches):
npx -y @bounded-systems/bounded-tools-mcp

# CLI — the SAME verbs, printing the verified JSON:
npx -y @bounded-systems/bounded-tools-mcp get_conformance
npx -y @bounded-systems/bounded-tools-mcp get_sbom

MCP 服务会将就绪信息输出到 stderr(stdout 是 MCP 通道):

bounded-tools-mcp ready (stdio) → https://bounded.tools; signature mode=off

MCP 客户端配置

{
  "mcpServers": {
    "bounded-tools": {
      "command": "npx",
      "args": ["-y", "@bounded-systems/bounded-tools-mcp"],
      "env": { "BOUNDED_TOOLS_MCP_SIGNATURE_MODE": "warn" }
    }
  }
}

资源

资源 URI端点内容
tools://conformanceapi/v1/conformance.jsonWeb-Build 一致性标准报告(HTML / WCAG 2.2 / ARIA)
tools://sbomsbom.spdx.jsonSPDX 软件物料清单
tools://webmanifestsite.webmanifestW3C Web 应用清单(PWA 站点元数据)

工具 / 命令行命令(只读)

两种界面使用相同的两个动词:

工具 / 命令参数返回值
get_conformance—Web-Build 一致性报告
get_sbom—SPDX 软件物料清单

资源读取和工具结果均包含 _meta.verification 块(相对于清单的路径、源 URL、已验证的 sha256,以及清单签名状态)。CLI 会输出已验证的 JSON;验证失败时会以非零状态退出,且不向 stdout 输出任何内容。

验证 / 信任模型

该站点发布一个签名清单 https://bounded.tools/site.sha256(sha256sum 格式),以及该清单的 Sigstore bundle:site.sha256.sigstore.json。核心会强制执行以下规则:

  1. 逐文件哈希检查(始终启用)。 每个进程仅获取一次清单;对于每项资源,获取该资源,对收到的字节计算 SHA-256,并要求摘要与清单条目一致。文件被篡改、CDN 边缘节点数据过期或遭遇 MITM,都会导致摘要不匹配,进而返回 VerificationError,而非响应。清单中不存在的路径同样会被拒绝。
  2. 清单签名检查(可选)。 BOUNDED_TOOLS_MCP_SIGNATURE_MODE=warn|require 会根据部署工作流身份(…/bounded-systems/site/.github/workflows/deploy.yml@refs/heads/main,OIDC 发行者为 https://token.actions.githubusercontent.com)验证 Sigstore bundle。这与 https://bounded.tools/provenance.json 中发布的无密钥身份相同。

配置

变量默认值含义
BOUNDED_TOOLS_MCP_BASE_URLhttps://bounded.tools提供站点 + API + 清单的源
BOUNDED_TOOLS_MCP_SIGNATURE_MODEoffoff | warn | require
BOUNDED_TOOLS_MCP_SIGNER_IDENTITYdeploy workflow SAN预期的 Sigstore 证书身份
BOUNDED_TOOLS_MCP_SIGNER_ISSUERGitHub Actions OIDC预期的 Sigstore OIDC 发行者
BOUNDED_TOOLS_MCP_FETCH_TIMEOUT_MS15000每次请求的获取超时时间

开发

npm install         # resolves @bounded-systems/static-mcp (npm) + verbspec (JSR bridge)
npm run build       # tsc → dist/
npm test            # node --test via tsx (server + CLI; no network)
npm run typecheck
node scripts/headless-check.mjs   # live end-to-end against bounded.tools

发布

一个标签即可将同一版本镜像发布到三个注册表。 推送 v* 标签会运行 publish.yml,并行发布到:

#注册表标识符身份验证
1npm@bounded-systems/bounded-tools-mcp可信发布(OIDC)+ 来源证明
2JSR(镜像)@bounded-systems/bounded-tools-mcp无令牌 OIDC(npx jsr publish)
3MCP Registryio.github.bounded-systems/bounded-tools-mcpGitHub-OIDC 命名空间身份验证(mcp-publisher)

没有长期有效的密钥——每个注册表都使用作业的短期 GitHub Actions OIDC 令牌(id-token: write)进行身份验证。npm 需要 npm ≥ 11.5(工作流会升级 npm 以确保满足这一要求)。mcp-registry 作业与 npm 作业相互独立(依赖项为 needs: verify,而非 needs: npm):注册表通过读取已发布 npm 包中的 mcpName 字段来证明包的所有权,因此可以独立运行或重试。

重要

版本必须保持一致。 发布版本号需在四处保持一致:package.json、deno.json、server.json 和 v<version> git 标签。工作流的 verify 作业会在发现任何不一致时直接中止整个发布,因此 npm 和 JSR 的版本绝不会出现偏差。MCP Registry 还要求 package.json 包含 "mcpName": "io.github.bounded-systems/bounded-tools-mcp"(它会读取已发布 npm 包中的此字段来证明所有权)。

一次性设置(维护者)——请在首个标签发布前完成

(a) npm — 可信发布方(在 npmjs.com 上)

  1. 以 @bounded-systems 作用域所有者的身份登录。
  2. 打开 @bounded-systems/bounded-tools-mcp 包页面 → Settings → Trusted Publisher。对于全新包,可能需要先手动发布一次 0.1.0(或创建该包),然后再切换到可信发布。
  3. 选择 GitHub Actions,并填写:
    • 组织 / 用户: bounded-systems
    • 仓库: bounded-tools-mcp
    • 工作流文件名: publish.yml
    • 环境: (留空)
  4. 保存。不会生成或存储任何令牌。

(b) JSR — 创建并关联包(在 jsr.io 上)

  1. 使用 GitHub 登录 jsr.io,并在 @bounded-systems 作用域下创建包 @bounded-systems/bounded-tools-mcp。
  2. 打开该包的 Settings 选项卡 → 在 GitHub Repository 下输入 bounded-systems/bounded-tools-mcp,然后点击 Link。关联仓库后,此工作流即可进行无令牌 OIDC 发布。

(c) MCP Registry — 无需预先授权

io.github.bounded-systems/* 命名空间会通过 GitHub OIDC 自动授权:由于此仓库位于 github.com/bounded-systems 下,mcp-publisher login github-oidc 会通过 Actions 运行本身证明所有权。

发布版本(单条命令)
# 1. Bump the version in ALL of: package.json, deno.json, server.json. Commit.
# 2. Tag with the SAME version and push — this is the only command:
git tag v0.1.0 && git push origin v0.1.0
本地试运行(验证但不发布)
npm pack --dry-run                                   # npm tarball contents
npx --yes jsr publish --dry-run --allow-slow-types   # JSR (or: deno publish --dry-run --allow-slow-types)
mcp-publisher validate ./server.json                 # MCP Registry schema check

bounded-tools-mcp 依赖 @bounded-systems/static-mcp;该核心包独立发布(通过其自身的 v* 标签发布到 JSR + npm),并需在发布此标签前完成。

许可证

MIT — 参见 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。