Bounded Tools Mcp

io.github.bounded-systems由 GitHub 帳號 bounded-systems 發布v0.1.0更新於 Nov 10, 2026

Read-only MCP server over bounded.tools's Sigstore-verified static API (stdio).

已驗證STDIO僅桌面開發者工具安全與監控

概覽

AI 產生的概覽

唯讀 MCP 伺服器,取得 bounded.tools 的簽章靜態 JSON 產物,並依 Sigstore 簽章清單逐位元組驗證。

可以做什麼
提供兩個唯讀工具 get_conformance 與 get_sbom,以及資源 tools://conformance、tools://sbom 和 tools://webmanifest。每個回應都從 bounded.tools 取得,並在回傳前與站台簽章的 sha256 清單逐位元組比對;不符或清單中不存在的路徑會被拒絕。結果帶有 _meta.verification 區塊,包含路徑、來源 URL、已驗證的 sha256 與簽章狀態。相同動詞也可作為 CLI 指令使用。
適用情境
當助理需要 bounded.tools 的 Web-Build 合規報告或 SPDX 軟體物料清單,並希望取得位元組未被竄改的密碼學保證時使用。它不是通用的網頁擷取或部落格閱讀工具。
執行需求
需要 Node.js 18.17 或更新版本;透過 npx 以 stdio 在本機執行。需要連線至 bounded.tools 的網路(或以 BOUNDED_TOOLS_MCP_BASE_URL 設定的基礎位址)。選用變數:BOUNDED_TOOLS_MCP_SIGNATURE_MODE(off、warn、require)、BOUNDED_TOOLS_MCP_SIGNER_IDENTITY、BOUNDED_TOOLS_MCP_SIGNER_ISSUER、BOUNDED_TOOLS_MCP_FETCH_TIMEOUT_MS。不需要帳號或 API 金鑰。
安裝前請注意
唯讀:不會寫入、傳送或刪除資料。它透過網路從 bounded.tools 取得內容,因此來源站台會看到請求。簽章驗證預設關閉;可將 BOUNDED_TOOLS_MCP_SIGNATURE_MODE 設為 warn 或 require 以檢查 Sigstore 清單簽章。修改 BOUNDED_TOOLS_MCP_BASE_URL 或簽署者身分/簽發者變數會改變信任對象。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Bounded Tools Mcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

@bounded-systems/bounded-tools-mcp

A local, read-only MCP server (and a matching CLI) over bounded.tools' signed static API.

It exposes the parts of the site that are served as verifiable, content-addressed JSON — the Web-Build Conformance report and the SPDX SBOM — to any MCP client (Claude Desktop, Claude Code, etc.), and verifies every response byte-for-byte against the site's Sigstore-signed sha256 manifest before handing it back. If the bytes a client would receive don't match the signed manifest, it refuses to return them.

It runs locally over stdio — the client spawns it as a subprocess. There is no hosted server and no network listener, which preserves the site's static / no-attack-surface posture.

A thin implementation of a generic core

This package is thin. All of the reusable machinery — the verifying fetch client, the sha256 manifest + Sigstore checks, and the VerbSpec → MCP (tools + resources) / VerbSpec → CLI projection — lives in @bounded-systems/static-mcp. bounded-tools-mcp supplies only:

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

Two surfaces, one definition. verbspec projects each verb to both an MCP tool and a CLI subcommand. The exact same verb set backs the MCP tools and the CLI commands — no second definition, no drift.

What's exposed (and what isn't)

bounded.tools is a static site whose verifiable surface is intentionally small. Only artifacts the site serves as signed, content-addressed JSON are exposed here — each is fetched and verified byte-for-byte against the signed manifest:

Served asArtifactExposed
signed JSONapi/v1/conformance.json✅ get_conformance · tools://conformance
signed JSONsbom.spdx.json✅ get_sbom · tools://sbom
signed JSONsite.webmanifest✅ tools://webmanifest (resource only)
signed HTML + Markdownthe blog (blog/*.html, blog/*.md)❌ not JSON — see below

Honesty over surface area. The blog is covered by the signed manifest, but it is served as HTML + Markdown, not as a JSON feed or per-post JSON documents. The verified-static core fetches-and-JSON-parses each artifact, so exposing the blog as a "tool" would mean fabricating a JSON shape the site does not actually serve. It is therefore left out rather than faked. If bounded.tools later publishes a signed posts.json (and per-post JSON), list_posts / get_post verbs drop straight in, exactly as in site-mcp.

Install / run

Requires Node ≥ 18.17. The verbspec dependency is published to JSR, so installs resolve it through JSR's npm bridge — the included .npmrc sets @jsr:registry=https://npm.jsr.io. (Consuming from a fresh environment, add that one line to your npm config.)

bash
# 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_conformancenpx -y @bounded-systems/bounded-tools-mcp get_sbom

The MCP server logs a readiness line to stderr (stdout is the MCP channel):

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

MCP client configuration

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

Resources

Resource URIEndpointContents
tools://conformanceapi/v1/conformance.jsonWeb-Build Conformance Standard report (HTML / WCAG 2.2 / ARIA)
tools://sbomsbom.spdx.jsonSPDX software bill of materials
tools://webmanifestsite.webmanifestW3C web app manifest (PWA site metadata)

Tools / CLI commands (read-only)

The same two verbs, on both surfaces:

Tool / commandArgsReturns
get_conformance—The Web-Build Conformance report
get_sbom—The SPDX software bill of materials

Resource reads and tool results carry a _meta.verification block (the manifest-relative path, source URL, the verified sha256, and the manifest signature status). The CLI prints the verified JSON; a verification failure exits non-zero with nothing on stdout.

Verification / trust model

The site publishes a single signed manifest, https://bounded.tools/site.sha256 (sha256sum format), and a Sigstore bundle over it, site.sha256.sigstore.json. The core enforces:

  1. Per-file hash check (always on). Fetch the manifest once per process; for every resource, fetch it, SHA-256 the received bytes, and require that digest to equal the manifest entry. A tampered file, a stale CDN edge, or a MITM → mismatch → VerificationError instead of a response. A path absent from the manifest is likewise refused.
  2. Manifest signature check (optional). BOUNDED_TOOLS_MCP_SIGNATURE_MODE=warn|require verifies the Sigstore bundle against the deploy workflow identity (…/bounded-systems/site/.github/workflows/deploy.yml@refs/heads/main, OIDC issuer https://token.actions.githubusercontent.com). This is the same keyless identity published in https://bounded.tools/provenance.json.

Configuration

VariableDefaultMeaning
BOUNDED_TOOLS_MCP_BASE_URLhttps://bounded.toolsOrigin serving the site + API + manifest
BOUNDED_TOOLS_MCP_SIGNATURE_MODEoffoff | warn | require
BOUNDED_TOOLS_MCP_SIGNER_IDENTITYdeploy workflow SANExpected Sigstore certificate identity
BOUNDED_TOOLS_MCP_SIGNER_ISSUERGitHub Actions OIDCExpected Sigstore OIDC issuer
BOUNDED_TOOLS_MCP_FETCH_TIMEOUT_MS15000Per-request fetch timeout

Development

bash
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 typechecknode scripts/headless-check.mjs   # live end-to-end against bounded.tools

Publishing

One tag publishes the same version to three registries, mirrored. Pushing a v* tag runs publish.yml, which fans out to:

#RegistryIdentifierAuth
1npm@bounded-systems/bounded-tools-mcptrusted publishing (OIDC) + provenance
2JSR (mirror)@bounded-systems/bounded-tools-mcptokenless OIDC (npx jsr publish)
3MCP Registryio.github.bounded-systems/bounded-tools-mcpGitHub-OIDC namespace auth (mcp-publisher)

There are no long-lived secrets — every registry authenticates with the job's short-lived GitHub Actions OIDC token (id-token: write). npm needs npm ≥ 11.5 (the workflow upgrades npm to guarantee this). The mcp-registry job is decoupled from the npm job (needs: verify, NOT needs: npm): the registry proves package ownership by reading the mcpName field off the already-published npm package, so it can run/retry independently.

[!IMPORTANT] Versions must stay in sync. The release version lives in four places that must all match: package.json, deno.json, server.json, and the v<version> git tag. The workflow's verify job hard-fails the whole release on any mismatch, so npm and JSR can never drift apart. The MCP Registry also requires package.json to carry "mcpName": "io.github.bounded-systems/bounded-tools-mcp" (it reads that field off the published npm package to prove ownership).

One-time setup (maintainer) — do these BEFORE the first tag

(a) npm — Trusted Publisher (on npmjs.com)

  1. Sign in as an owner of the @bounded-systems scope.
  2. Open the package page for @bounded-systems/bounded-tools-mcp → Settings → Trusted Publisher. For a brand-new package you may need to publish 0.1.0 once manually (or create the package), then switch to trusted publishing.
  3. Choose GitHub Actions and enter:
    • Organization / user: bounded-systems
    • Repository: bounded-tools-mcp
    • Workflow filename: publish.yml
    • Environment: (leave blank)
  4. Save. No token is generated or stored anywhere.

(b) JSR — create + link the package (on jsr.io)

  1. Sign in to jsr.io with GitHub and create the package @bounded-systems/bounded-tools-mcp under the @bounded-systems scope.
  2. Open the package's Settings tab → under GitHub Repository enter bounded-systems/bounded-tools-mcp and click Link. Linking the repo enables tokenless OIDC publishing from this workflow.

(c) MCP Registry — nothing to pre-authorize

The io.github.bounded-systems/* namespace is auto-authorized via GitHub OIDC: because this repo lives under github.com/bounded-systems, mcp-publisher login github-oidc proves ownership from the Actions run itself.

Cut a release (the single command)

bash
# 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

Local dry-runs (verify without publishing)

bash
npm pack --dry-run                                   # npm tarball contentsnpx --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 depends on @bounded-systems/static-mcp; that core is published independently (its own v* tag → JSR + npm) before cutting this tag.

License

MIT — see LICENSE.

來源:README.md,提交 1ae01c5

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分