bounded-tools-mcp について
bounded-tools-mcpは、bounded.tools向けのローカルな読み取り専用MCPサーバーとCLIです。選定したJSONファイルだけを公開し、返却前にSHA-256マニフェストと照合します。Sigstore署名の検証も任意で行えます。
主な機能
- 01読み取り専用のMCPツールとCLI
- 02バイト単位のSHA-256検証
- 03任意のSigstoreマニフェスト検証
- 04適合性レポートとSPDX SBOM
- 05検証済みサイト情報のリソース
活用シーン
- 01Web-Build適合性レポートの取得
- 02サイトのSPDXソフトウェア部品表の確認
- 03利用前のbounded.tools JSONの検証
MCP 対応
ローカルでstdio動作し、`get_conformance`と`get_sbom`のツールに加え、適合性レポート、SBOM、web manifestのリソースを公開します。返却前にサイトのSHA-256署名済みマニフェストと照合します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
@bounded-systems/bounded-tools-mcp
bounded.tools の署名付き静的 APIを利用する、ローカルの読み取り専用 MCP サーバー(および対応する CLI)です。
サイトが検証可能でコンテンツアドレス指定された JSONとして提供する部分 — Web-Build Conformance レポートと SPDX SBOM — を、あらゆる MCP クライアント(Claude Desktop、Claude Code など)に公開し、返却する前にすべてのレスポンスをサイトの Sigstore 署名付き sha256 マニフェストとバイト単位で照合して検証します。クライアントが受け取るバイト列が署名付きマニフェストと一致しない場合は、返却を拒否します。
stdio 経由でローカル実行され、クライアントがサブプロセスとして起動します。ホスト型サーバーもネットワークリスナーも存在しないため、サイトの静的/攻撃対象領域のない方針が維持されます。
汎用コアの薄い実装
このパッケージは薄い実装です。再利用可能な仕組み — 検証を行うフェッチクライアント、sha256 マニフェストと Sigstore のチェック、VerbSpec → MCP (tools + resources)/VerbSpec → CLI の射影 — はすべて
@bounded-systems/static-mcp にあります。bounded-tools-mcp が提供するのは、次のものだけです。
- 動詞(
src/verbs.ts)—get_conformance、get_sbom。それぞれ@bounded-systems/verbspecのVerbSpecとして一度だけ定義します。 - リソースカタログ(
src/catalog.ts)—tools://…リソース。 - 設定値(
src/config.ts)— オリジンと期待する署名者の識別情報。 - エントリーポイント(
src/index.ts)— サーフェスを選択し、仕様をコアに渡します。
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)
2 つのサーフェス、1 つの定義。 verbspec は各動詞をMCP ツールと CLI サブコマンドの両方に射影します。MCP ツールと CLI コマンドは、まったく同じ動詞セットに基づいており、二重定義も不整合もありません。
公開するもの(および公開しないもの)
bounded.tools は、検証可能なサーフェスを意図的に小さくした静的サイトです。ここで公開するのは、サイトが署名付きでコンテンツアドレス指定された JSONとして提供する成果物だけです。各成果物は取得され、署名付きマニフェストとバイト単位で照合して検証されます。
| 提供形式 | 成果物 | 公開 |
|---|---|---|
| 署名付き JSON | api/v1/conformance.json | ✅ get_conformance · tools://conformance |
| 署名付き JSON | sbom.spdx.json | ✅ get_sbom · tools://sbom |
| 署名付き JSON | site.webmanifest | ✅ tools://webmanifest(リソースのみ) |
| 署名付き HTML + Markdown | ブログ(blog/*.html、blog/*.md) | ❌ JSON ではありません — 詳細は以下をご覧ください |
公開範囲より誠実さを優先。 ブログも署名付きマニフェストの対象ですが、提供形式は HTML + Markdown であり、JSON フィードでも記事ごとの JSON ドキュメントでもありません。検証済み静的コアは各成果物を取得して JSON として解析するため、ブログを「ツール」として公開すると、サイトが実際には提供していない JSON の形式をでっち上げることになります。そのため、偽装して公開するのではなく、対象から除外しています。bounded.tools が将来、署名付きの
posts.json(および記事ごとの JSON)を公開すれば、site-mcpとまったく同じように、list_posts/get_postの動詞をそのまま追加できます。
インストール/実行
Node ≥ 18.17 が必要です。verbspec の依存関係は JSR に公開されているため、インストール時には JSR の npm ブリッジ経由で解決されます。同梱の .npmrc で @jsr:registry=https://npm.jsr.io を設定しています。(新しい環境で利用する場合は、この 1 行を 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://conformance | api/v1/conformance.json | Web-Build Conformance Standard レポート(HTML / WCAG 2.2 / ARIA) |
tools://sbom | sbom.spdx.json | SPDX ソフトウェア部品表 |
tools://webmanifest | site.webmanifest | W3C ウェブアプリマニフェスト(PWA サイトのメタデータ) |
ツール/CLI コマンド(読み取り専用)
どちらのインターフェースでも、同じ 2 つの動詞を使用します。
| ツール/コマンド | 引数 | 戻り値 |
|---|---|---|
get_conformance | — | Web-Build Conformance レポート |
get_sbom | — | SPDX ソフトウェア部品表 |
リソースの読み取りとツールの結果には、_meta.verification ブロック(マニフェスト相対パス、ソース URL、検証済みの sha256、マニフェスト署名のステータス)が含まれます。CLI は検証済みの JSON を出力します。検証に失敗すると、標準出力には何も出力せず、ゼロ以外の終了コードで終了します。
検証/信頼モデル
サイトは、単一の署名済みマニフェスト https://bounded.tools/site.sha256(sha256sum 形式)と、それに対する Sigstore バンドル site.sha256.sigstore.json を公開します。コアは以下を適用します。
- ファイルごとのハッシュチェック(常時有効)。 プロセスごとにマニフェストを 1 回取得します。各リソースについて取得したバイト列の SHA-256 を計算し、そのダイジェストがマニフェストのエントリと一致することを確認します。ファイルの改ざん、古い CDN エッジ、または MITM によって不一致が発生した場合は、応答の代わりに
VerificationErrorが返されます。マニフェストにないパスも同様に拒否されます。 - マニフェスト署名チェック(任意)。
BOUNDED_TOOLS_MCP_SIGNATURE_MODE=warn|requireは、デプロイワークフローの ID(…/bounded-systems/site/.github/workflows/deploy.yml@refs/heads/main、OIDC 発行者https://token.actions.githubusercontent.com)を使って Sigstore バンドルを検証します。これはhttps://bounded.tools/provenance.jsonで公開されているものと同じキーレス ID です。
設定
| 変数 | デフォルト | 意味 |
|---|---|---|
BOUNDED_TOOLS_MCP_BASE_URL | https://bounded.tools | サイト + API + マニフェストを提供するオリジン |
BOUNDED_TOOLS_MCP_SIGNATURE_MODE | off | off | warn | require |
BOUNDED_TOOLS_MCP_SIGNER_IDENTITY | deploy workflow SAN | 期待される Sigstore 証明書 ID |
BOUNDED_TOOLS_MCP_SIGNER_ISSUER | GitHub Actions OIDC | 期待される Sigstore OIDC 発行者 |
BOUNDED_TOOLS_MCP_FETCH_TIMEOUT_MS | 15000 | リクエストごとの取得タイムアウト |
開発
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
公開
1 つのタグで、同じバージョンを 3 つのレジストリにミラー公開します。
v* タグをプッシュすると、publish.yml が実行され、次のレジストリに処理を振り分けます。
| # | レジストリ | 識別子 | 認証 |
|---|---|---|---|
| 1 | npm | @bounded-systems/bounded-tools-mcp | 信頼された公開(OIDC)+ 来歴情報 |
| 2 | JSR(ミラー) | @bounded-systems/bounded-tools-mcp | トークン不要の OIDC(npx jsr publish) |
| 3 | MCP Registry | io.github.bounded-systems/bounded-tools-mcp | GitHub-OIDC による名前空間認証(mcp-publisher) |
長期間有効なシークレットはありません。各レジストリは、ジョブの有効期間が短い GitHub Actions OIDC トークン(id-token: write)で認証します。npm では npm ≥ 11.5 が必要です(これを保証するため、ワークフローで npm をアップグレードします)。mcp-registry ジョブは npm ジョブから切り離されています(needs: verify であり、needs: npm ではありません)。レジストリは、公開済みの npm パッケージから mcpName フィールドを読み取ってパッケージの所有権を確認するため、独立して実行・再試行できます。
重要
バージョンを一致させる必要があります。 リリースバージョンは、すべて一致させる必要がある 4 か所に記載されています。
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)
@bounded-systemsスコープの所有者としてサインインします。@bounded-systems/bounded-tools-mcpのパッケージページを開き、Settings → Trusted Publisher を選択します。新規パッケージの場合は、手動で一度0.1.0を公開する(またはパッケージを作成する)必要がある場合があります。その後、信頼された公開に切り替えます。- GitHub Actions を選択し、次の情報を入力します。
- Organization / user:
bounded-systems - Repository:
bounded-tools-mcp - Workflow filename:
publish.yml - Environment: (空欄のままにします)
- Organization / user:
- 保存します。トークンは生成も保存もされません。
(b) JSR — パッケージの作成とリンク(jsr.io)
- GitHub で jsr.io にサインインし、
@bounded-systemsスコープの下に@bounded-systems/bounded-tools-mcpパッケージを作成します。 - パッケージの 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 を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。