
Site Mcp
io.github.bounded-systems由 GitHub 帳號 bounded-systems 發布v0.2.0更新於 Nov 10, 2026
Read-only MCP server over robertdelanghe.dev's Sigstore-verified static API (stdio).
概覽
唯讀 MCP 伺服器,透過 stdio 提供 robertdelanghe.dev 的簽章靜態 API——個人資料、文章、GitHub 語料庫、履歷憑證與 OpenAPI 文件,並逐檔驗證雜湊。
- 可以做什麼
- 以本機 stdio 方式執行,將該網站的識別資料暴露為 MCP 資源(site://profile、site://posts、site://post/{slug}、site://corpus、site://conformance、site://resume-vc、site://openapi),並提供四個唯讀工具:list_posts、get_post、get_conformance、get_corpus。每個回應在回傳前都會與網站經 Sigstore 簽章的 sha256 清單逐位元組比對;不符或清單中不存在的路徑會被拒絕。工具結果與資源讀取都帶有 _meta.verification 區塊,內含已驗證的雜湊與簽章狀態。同一組動詞也可作為 CLI 子命令使用。
- 適用情境
- 適合需要讓助理讀取這個特定網站已發布內容與中繼資料的情境——文章、GitHub 語料庫統計、DOM 一致性報告、履歷可驗證憑證或 OpenAPI 文件——並且希望取得密碼學保證,確認位元組在傳輸途中或 CDN 邊緣未被竄改。
- 執行需求
- 需要 Node.js 18.17 或更新版本,透過 npx 以本機 stdio 子程序啟動。需要連線至所設定的來源站(預設 或 require)、SITE_MCP_BASE_URL、SITE_MCP_SIGNER_IDENTITY、SITE_MCP_SIGNER_ISSUER、SITE_MCP_FETCH_TIMEOUT_MS。不需要帳號或 API 金鑰。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Site Mcp,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
@bounded-systems/site-mcp
A local, read-only MCP server (and a matching CLI) over robertdelanghe.dev's signed static API.
It exposes the site's identity data — profile, writing, the GitHub corpus, the
résumé credential, the OpenAPI doc — 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 now 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.
site-mcp supplies only:
- the verbs (
src/verbs.ts) —list_posts,get_post,get_conformance,get_corpus, each authored once as a@bounded-systems/verbspecVerbSpec; - the resource catalog (
src/catalog.ts) — thesite://…resources; - the config values (
src/config.ts) — the origin and expected signer identity; and - the entry (
src/index.ts) — which picks a surface and hands the spec to the core.
Two surfaces, one definition. verbspec projects each verb to both an MCP tool and a CLI subcommand. The exact same verb set backs
site-mcp's MCP tools and its CLI commands — no second definition, no drift.
Install / run
Requires Node ≥ 18.17. site-mcp's 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.)
The MCP server logs a readiness line to stderr (stdout is the MCP channel):
MCP client configuration
Resources
Tools / CLI commands (read-only)
The same four verbs, on both surfaces:
One verb per subject, not one per drill-down
A client loads every tool's name, description and input schema into its context
before any call is made — a cost paid on every session whether or not the
tool is used — and choosing among the tools is itself a fan-out. So the tool list
is a fold: F is the list, a call is one step of the generator rule, and a
terminal response is where expansion stops.
Which makes a verb per drill-down the wrong shape: it grows the part paid
always in order to shrink the part paid sometimes. get_conformance_index +
get_conformance_area + get_corpus_index + get_corpus_list would take this
server from three tools to eight.
Instead there is one verb per subject, and the parameter is the generator
rule: no argument returns the index, an argument unfolds one branch of it, and
--full still reaches the unfolded document at its own path. Nothing was removed
from the API — site://conformance and site://corpus still serve the complete
documents, and site://conformance/index and site://corpus/index are new
entry points alongside them.
Changed default.
get_conformancewith no arguments used to return the whole 19.7 KB report; it now returns the 3.2 KB index. Pass--full(CLI) or{"full": true}(MCP) for the previous behaviour.
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://robertdelanghe.dev/site.sha256
(sha256sum format), and a Sigstore bundle over it, site.sha256.sigstore.json.
The core enforces:
- 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 →
VerificationErrorinstead of a response. A path absent from the manifest is likewise refused. - Manifest signature check (optional).
SITE_MCP_SIGNATURE_MODE=warn|requireverifies the Sigstore bundle against the deploy workflow identity (…/bdelanghe/site/.github/workflows/deploy.yml@refs/heads/main).
Sigstore backend /
@bounded-systems/verify. The optional manifest-signature step is intended to delegate to@bounded-systems/verify, the canonical in-process bundle verifier. As of[email protected]that package ships as a self-executing CLI with no exported function (importing it runs and exits the process), so the core keeps a minimal, behaviorally-identical copy of the check and the gap is filed upstream. See static-mcp's README.
Configuration
Development
Publishing
One tag publishes the same version to three registries, mirrored. Pushing a
v* tag runs publish.yml, which fans out to:
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).
[!IMPORTANT] Versions must stay in sync. The release version lives in four places that must all match:
package.json,deno.json,server.json, and thev<version>git tag. The workflow'sverifyjob hard-fails the whole release on any mismatch, so npm and JSR can never drift apart. The MCP Registry also requirespackage.jsonto carry"mcpName": "io.github.bounded-systems/site-mcp"(it reads that field off the published npm package to prove ownership).
The MCP Registry job runs after the npm job, because the registry verifies
ownership by reading mcpName from the freshly-published npm package.
One-time setup (maintainer) — do these BEFORE the first tag
These three registry-side authorizations only need to happen once. Two of the three (JSR, MCP Registry) are pure repo-link / OIDC — no tokens are minted.
(a) npm — Trusted Publisher (on npmjs.com)
- Sign in as an owner of the
@bounded-systemsscope. - Open the package page for
@bounded-systems/site-mcp→ Settings → Trusted Publisher. For a brand-new package you may need to publish0.1.0once manually (or create the package), then switch to trusted publishing. - Choose GitHub Actions and enter:
- Organization / user:
bounded-systems - Repository:
site-mcp - Workflow filename:
publish.yml← (waspublish-npm.yml) - Environment: (leave blank)
- Organization / user:
- Save. No token is generated or stored anywhere. Ensure the package's publishing-access policy allows automation/OIDC (trusted publishers satisfy 2FA).
(b) JSR — create + link the package (on jsr.io)
- Sign in to jsr.io with GitHub and create the package
@bounded-systems/site-mcpunder the@bounded-systemsscope. - Open the package's Settings tab → under GitHub Repository enter
bounded-systems/site-mcpand click Link. Linking the repo is what enables tokenless OIDC publishing from this workflow (same idea as npm's trusted publisher). No token is created.
(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 of the namespace from the Actions run itself.
There is no registry-side claim/consent/linking step to do in advance — the
first publish.yml run authenticates and registers the server on its own.
(Package-ownership of the npm entry is proven separately by the mcpName field;
see the note above.)
Cut a release (the single command)
That one v* tag triggers publish.yml → npm + JSR + MCP Registry, all at the
same version. You can also run it from the Actions tab via workflow_dispatch
(which reuses the package.json version in place of a tag).
Local dry-runs (verify without publishing)
site-mcp depends on
@bounded-systems/static-mcp; publish the core first (its ownv*tag → JSR + npm), then cut site-mcp's tag.
License
MIT — see LICENSE. The site data itself is published under CC BY 4.0.
來源:README.md,提交 7119dde
工具
0版本歷史
1- v0.2.0最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分