site-mcp について
site-mcpは、robertdelanghe.devのプロフィール、記事などを公開する、MCPクライアント向けのローカル読み取り専用サーバーです。Sigstore署名済みマニフェストで応答を検証し、MCPとCLIで操作定義を共有します。
主な機能
- 01記事一覧と個別記事の取得
- 02適合性レポートとGitHubコーパスの取得
- 03プロフィールや履歴書VCのリソース公開
- 04SHA-256マニフェストによる応答検証
- 05MCPとCLIで操作定義を共有
活用シーン
- 01サイトの記事と本文の閲覧
- 02ページ適合性レポートの確認
- 03GitHubコーパスデータの参照
MCP 対応
stdio経由でMCPクライアントに読み取り専用のツールとリソースを提供します。応答をサイトの署名済みSHA-256マニフェストと照合し、検証失敗時は返しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
@bounded-systems/site-mcp
robertdelanghe.dev の署名付き静的 APIを利用する、ローカルの読み取り専用 MCP サーバー(および対応する CLI)です。
このサイトのプロフィール、記事、GitHub コーパス、履歴書のクレデンシャル、OpenAPI ドキュメントといったアイデンティティデータを、あらゆる MCP クライアント(Claude Desktop、Claude Code など)に公開します。また、応答を返す前に、すべての応答バイト列をサイトの Sigstore 署名付き sha256 マニフェストとバイト単位で照合します。クライアントが受け取るバイト列が署名付きマニフェストと一致しない場合、返却を拒否します。
stdio 経由でローカル実行され、クライアントがサブプロセスとして起動します。ホスト型サーバーもネットワークリスナーもないため、サイトの静的で攻撃対象領域のない状態が保たれます。
汎用コアの薄い実装
このパッケージは現在、薄い構成です。再利用可能な機能である、検証付きフェッチクライアント、sha256 マニフェストと Sigstore の検証、VerbSpec → MCP (tools + resources) / VerbSpec → CLI の変換はすべて、@bounded-systems/static-mcp にあります。site-mcp が提供するのは、次のものだけです。
- 動詞(
src/verbs.ts) —list_posts、get_post、get_conformance、get_corpus。それぞれを@bounded-systems/verbspecのVerbSpecとして一度だけ定義します。 - リソースカタログ(
src/catalog.ts) —site://…リソース。 - 設定値(
src/config.ts) — オリジンと、期待される署名者のアイデンティティ。 - エントリーポイント(
src/index.ts) — 使用するインターフェースを選び、仕様をコアに渡します。
src/verbs.ts ─┐
src/catalog.ts ├─▶ buildSiteSpec(config) ─▶ @bounded-systems/static-mcp
src/config.ts ─┘ serveVerifiedStaticMcp(spec, config) (MCP, stdio)
runStaticCli(spec, config, argv) (CLI)
2 つのインターフェース、1 つの定義。 verbspec は各動詞を MCP ツールと CLI サブコマンドの両方に変換します。同じ動詞セットが
site-mcpの MCP ツールと CLI コマンドを支えます。2 つ目の定義はなく、差異も生じません。
インストール/実行
Node ≥ 18.17 が必要です。site-mcp の 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/site-mcp
# CLI — the SAME verbs, printing the verified JSON:
npx -y @bounded-systems/site-mcp list_posts
npx -y @bounded-systems/site-mcp get_conformance # the index
npx -y @bounded-systems/site-mcp get_conformance accessibility # one area
npx -y @bounded-systems/site-mcp get_conformance --full # every criterion
npx -y @bounded-systems/site-mcp get_corpus # the index
npx -y @bounded-systems/site-mcp get_corpus topics # one full list
npx -y @bounded-systems/site-mcp get_post agent-authored-code-drift
MCP サーバーは stderr に起動準備完了の行をログ出力します(stdout は MCP チャネルです)。
site-mcp ready (stdio) → https://robertdelanghe.dev; signature mode=off
MCP クライアントの設定
{
"mcpServers": {
"robertdelanghe": {
"command": "npx",
"args": ["-y", "@bounded-systems/site-mcp"],
"env": { "SITE_MCP_SIGNATURE_MODE": "warn" }
}
}
}
リソース
| リソース URI | エンドポイント | 内容 |
|---|---|---|
site://profile | profile.json | 見出し、イントロ、ラベル、リンク |
site://posts | posts.json | 記事の JSON Feed(記事一覧) |
site://post/{slug} | posts/{slug}.json | 1 件の記事(テンプレート化。list でフィードから列挙) |
site://corpus | corpus.json | GitHub コーパス:統計情報とハイライト |
site://conformance | conformance.json | ページごとの DOM 適合性レポート |
site://resume-vc | resume.vc.json | Verifiable Credential としての履歴書 |
site://openapi | openapi.json | API の OpenAPI 3.2 ドキュメント |
ツール/CLI コマンド(読み取り専用)
どちらのインターフェースでも、同じ 4 つの動詞を使用します。
| ツール/コマンド | 引数 | 戻り値 |
|---|---|---|
list_posts | — | 記事フィード(スラッグ、タイトル、概要、タグ) |
get_post | slug | スラッグで指定した 1 件の記事 |
get_conformance | — | area | --full | 適合性のインデックス(3.2 KB)| 1 つの領域 | すべての基準(19.7 KB) |
get_corpus | — | list | --full | コーパスのインデックス(9.2 KB)| 1 つの順位付きリスト | コーパス全体(71.7 KB) |
ドリルダウンごとではなく、対象ごとに動詞を1つ
クライアントは、呼び出しが行われる前にすべてのツールの名前、説明、入力スキーマをコンテキストに読み込みます。ツールを使うかどうかにかかわらず、セッションごとに発生するコストです。また、ツールの選択自体もファンアウトになります。そのため、ツールリストは畳み込みです。F はリストであり、呼び出しはジェネレータールールの1ステップ、終端応答は展開が止まる場所です。
つまり、ドリルダウンごとに動詞を用意するのは適切な形ではありません。常に発生するコストを増やし、ときどき発生するコストを減らすことになるからです。get_conformance_index + get_conformance_area + get_corpus_index + get_corpus_list とすると、このサーバーのツールは3つから8つに増えます。
代わりに、対象ごとに動詞を1つ用意し、パラメーターがジェネレータールールになります。引数なしではインデックスを返し、引数を指定するとその分岐を1つ展開し、--full では展開済みのドキュメントをそのパスから取得できます。API から削除されたものはありません。site://conformance と site://corpus は引き続き完全なドキュメントを提供し、新しいエントリーポイントとして site://conformance/index と site://corpus/index が追加されています。
デフォルトの変更。 引数なしの
get_conformanceは、以前はレポート全体(19.7 KB)を返していましたが、現在はインデックス(3.2 KB)を返します。以前の動作にするには、--full(CLI)または{"full": true}(MCP)を指定してください。
リソースの読み取りとツールの結果には、_meta.verification ブロック(マニフェスト相対パス、ソース URL、検証済みの sha256、マニフェストの署名状態)が含まれます。CLI は検証済みの JSON を出力します。検証に失敗すると、標準出力に何も出さずにゼロ以外のステータスで終了します。
検証/信頼モデル
サイトは、単一の署名付きマニフェスト https://robertdelanghe.dev/site.sha256(sha256sum 形式)と、そのマニフェストの Sigstore バンドル site.sha256.sigstore.json を公開しています。コアでは、次の処理を行います。
- ファイルごとのハッシュチェック(常時有効)。 プロセスごとにマニフェストを一度取得します。各リソースについて、そのリソースを取得し、受信したバイト列の SHA-256 を計算して、そのダイジェストがマニフェストのエントリーと一致することを必須とします。改ざんされたファイル、古い CDN エッジ、または MITM により、不一致が発生すると、応答の代わりに
VerificationErrorが返されます。マニフェストに存在しないパスも同様に拒否されます。 - マニフェストの署名チェック(任意)。
SITE_MCP_SIGNATURE_MODE=warn|requireを設定すると、デプロイワークフローの ID(…/bdelanghe/site/.github/workflows/deploy.yml@refs/heads/main)に照らして Sigstore バンドルを検証します。
Sigstore バックエンド/
@bounded-systems/verify。 任意のマニフェスト署名チェックは、標準的なインプロセスのバンドル検証機能である@bounded-systems/verifyに処理を委譲する想定です。[email protected]の時点では、このパッケージはエクスポートされた関数のない自己実行型 CLI として提供されています(インポートすると実行され、プロセスが終了します)。そのため、コアには動作が同一の最小限のチェックが組み込まれており、この差異は上流に報告されています。static-mcp の README を参照してください。
設定
| 変数 | デフォルト | 意味 |
|---|---|---|
SITE_MCP_BASE_URL | https://robertdelanghe.dev | サイト、API、マニフェストを提供するオリジン |
SITE_MCP_SIGNATURE_MODE | off | off | warn | require |
SITE_MCP_SIGNER_IDENTITY | deploy workflow SAN | 想定する Sigstore 証明書の ID |
SITE_MCP_SIGNER_ISSUER | GitHub Actions OIDC | 想定する Sigstore OIDC 発行者 |
SITE_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
公開
1 つのタグをプッシュすると、同じバージョンが 3 つのレジストリにミラーリングされて公開されます。 v* タグをプッシュすると publish.yml が実行され、次のレジストリに配信されます。
| # | レジストリ | 識別子 | 認証 |
|---|---|---|---|
| 1 | npm | @bounded-systems/site-mcp | 信頼された公開(OIDC)+来歴情報 |
| 2 | JSR(ミラー) | @bounded-systems/site-mcp | トークンレス OIDC(npx jsr publish) |
| 3 | MCP Registry | io.github.bounded-systems/site-mcp | GitHub-OIDC による名前空間認証(mcp-publisher) |
長期間有効なシークレットはありません。各レジストリは、ジョブの有効期間が短い GitHub Actions OIDC トークン(id-token: write)で認証します。npm では npm ≥ 11.5 が必要です(ワークフローで npm をアップグレードして、この要件を満たします)。
重要
バージョンを一致させる必要があります。 リリースバージョンは、すべて一致させる必要がある4 か所にあります。
package.json、deno.json、server.json、およびv<version>git タグです。ワークフローのverifyジョブは、不一致があるとリリース全体を失敗させるため、npm と JSR のバージョンが食い違うことはありません。また、MCP Registry では、package.jsonに"mcpName": "io.github.bounded-systems/site-mcp"を設定する必要があります(公開された npm パッケージからこのフィールドを読み取り、所有権を確認します)。
MCP Registry のジョブは npm のジョブの後に実行されます。これは、レジストリが新たに公開された npm パッケージから mcpName を読み取り、所有権を確認するためです。
1 回限りの設定(メンテナー)— 最初のタグを付ける前に実施してください
レジストリ側での次の 3 つの認可は、いずれも 1 回だけ行えば十分です。3 つのうち 2 つ(JSR、MCP Registry)はリポジトリのリンクと OIDC のみを使用し、トークンは発行されません。
(a) npm — 信頼された公開者(npmjs.com)
@bounded-systemsスコープのオーナーとしてサインインします。@bounded-systems/site-mcpのパッケージページを開き、Settings → Trusted Publisher に進みます。新しいパッケージの場合は、いったん手動で0.1.0を公開する(またはパッケージを作成する)必要がある場合があります。その後、信頼された公開に切り替えます。- GitHub Actions を選択し、次の情報を入力します。
- Organization / user:
bounded-systems - Repository:
site-mcp - Workflow filename:
publish.yml← (以前はpublish-npm.yml) - Environment: (空欄のまま)
- Organization / user:
- 保存します。トークンは生成されず、どこにも保存されません。パッケージの公開アクセス ポリシーで自動化/OIDC が許可されていることを確認してください(信頼された公開者は 2FA の要件を満たします)。
(b) JSR — パッケージの作成とリンク(jsr.io)
- GitHub で jsr.io にサインインし、
@bounded-systemsスコープの下に@bounded-systems/site-mcpパッケージを作成します。 - パッケージの Settings タブを開き、GitHub Repository の下に
bounded-systems/site-mcpを入力して Link をクリックします。リポジトリをリンクすると、このワークフローからのトークンレス OIDC 公開が可能になります(npm の信頼された公開者と同じ仕組みです)。トークンは作成されません。
(c) MCP Registry — 事前認可は不要
io.github.bounded-systems/* 名前空間はGitHub OIDC により自動認可されます。このリポジトリは github.com/bounded-systems の下にあるため、mcp-publisher login github-oidc により、Actions の実行自体を通じて名前空間の所有権が証明されます。事前にレジストリ側で申請/同意/リンクする手順はありません。最初の publish.yml の実行で認証が行われ、サーバーが自動的に登録されます。(npm エントリのパッケージ所有権は、別途 mcpName フィールドで証明されます。上記の注意事項を参照してください。)
リリースを作成する(コマンドは 1 つ)
# 1. Bump the version in ALL of: package.json, deno.json, server.json
# (and the package entry in 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
この v* タグだけで publish.yml が実行され、同じバージョンが npm、JSR、MCP Registry に公開されます。Actions タブから workflow_dispatch を実行することもできます(タグの代わりに、その時点の package.json のバージョンを使用します)。
ローカルでのドライラン(公開せずに検証)
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
site-mcp は
@bounded-systems/static-mcpに依存しています。先にコアを公開してください(コア自身のv*タグで JSR と npm に公開)。その後、site-mcp のタグを付けます。
ライセンス
MIT — LICENSEを参照してください。サイトデータ自体はCC BY 4.0の下で公開されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。