mcpField
M
mcp-trust

mcp-trust

本地服务
github.com/saagpatel安全02 周前更新

关于 mcp-trust

mcp-trust 是用于评估公共 MCP 服务风险的注册表,可供 Agent 在连接前查询危险等级、透明度和扫描依据。它提供只读 MCP 接口,并通过严格校验和失效关闭规则处理目录数据。

主要功能

  1. 01查询服务的 A–F 危险等级
  2. 02查看风险维度与扫描发现
  3. 03解释评分方法与透明度
  4. 04校验目录快照并失效关闭

适用场景

  1. 01连接公共 MCP 服务前检查风险
  2. 02比较服务的扫描结果与透明度
  3. 03离线验证已签名的快照

MCP 相关

它以只读 MCP 服务形式提供 `list_servers`、`check_server` 和 `get_methodology` 工具,供 MCP 客户端查询内置目录快照。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"saagpatel-mcp-trust": {
"command": "uvx",
"args": [
"mcp-trust"
]
}
}
}
启动命令uvx mcp-trust

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

安装包
pypimcp-trust0.1.1

工具

3

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

MCP Trust Registry

CI License: MIT

连接前先检查。为 AI Agent 所依赖的 MCP 服务提供中立、公开的危险等级。

在线版: mcp-trust.vercel.app

尚未发布到 PyPI。 请使用下方的快速入门从源代码安装。

用作 MCP 服务

mcp-trust 以只读 MCP 服务的形式运行,让 Agent 能在连接前检查服务的危险等级——它提供真实扫描等级的内置快照,并明确标注每条记录的来源,因此无需数据库或网络。

mcp-trust mcp-serve          # from a source/dev install (works today)
uvx mcp-trust mcp-serve      # once published to PyPI
工具描述
list_servers所有已评定等级的 MCP 服务,以及其 A-F 等级、透明度和危险分数。
check_server通过 slug 查询单个服务的完整等级、风险维度和发现项。
get_methodologyA-F 等级和透明度维度的计算方式,以及诚信模型。

MCP 运行时只有在通过确定性的 schema-v2 验证后,才会接纳打包的目录。验证包括拒绝重复键、检查必需字段和类型、验证 slug 和来源坐标唯一性、检查受支持的枚举值、确认沙箱与扫描模式一致,以及确认扫描时间戳包含时区信息。接纳流程还会验证等级与危险分数之间的关系、透明度与注释覆盖率之间的关系,以及关键发现项与等级上限之间的关系。原始 JSON 大小上限为 1 MiB,并设有确定性的服务、发现项、工具和公开字符串数量上限。Schema v2 会保留新增的未知字段;缺少或无效的必需字段以及未知的 schema 版本均会导致验证失败。

如果目录未能通过接纳验证,list_servers 和 check_server 将不提供任何记录,并返回 mcp-trust-mcp-error.v1,其中包含状态 UNKNOWN、错误代码 CATALOG_SNAPSHOT_INVALID、排序后的原因代码,以及 server_count_served: 0。get_methodology 仍可使用。此边界会检查内部一致性,但不能证明快照的真实性、作者身份、不可变性或时效性。

离线使用者可以通过 mcp-trust verify-snapshot 补充这些缺失的发布检查:一份独立的 Ed25519 声明会绑定确切的快照字节、发布者 ID、有界的签发/过期时间窗口、单调递增的发布 ID,以及先前的使用者检查点。使用者必须独立固定信任根 SHA-256,并保存返回的检查点,以防回滚。对于无效、过期、签名者未知、存在分叉或已回滚的输入,只会返回 UNKNOWN 原因代码,不会返回任何等级。请参阅 docs/OFFLINE-SNAPSHOT-TRUST-V1.md。 声明时效性证明的是近期发布授权,而非近期扫描;每条记录的扫描时间戳和 90 天过期策略仍是独立检查。

目前尚未随附生产环境信任根、签名密钥、声明或检查点,因此除非使用者另行提供并固定这些输入,否则内置 MCP 快照仍仅经过结构验证。测试夹具密钥并非发布密钥。

连接 MCP 服务意味着赋予它影响 Agent 行为的能力。工具投毒、提示词注入、权限过宽和工具突变式抽逃都是有记录的攻击类型——而目前还没有快捷的方法能在接入服务前对其进行审查。MCP Trust Registry 会扫描公开的 MCP 服务,为每个服务提供一个直观的危险等级(A-F)、单独的透明度信号,以及相应的发现项。

可以把它看作 OSV.dev / Socket.dev / haveibeenpwned,专门面向 MCP 服务。

前提条件

  • Python 3.12 或更高版本;.python-version 为本地设置固定了 3.15.0
  • uv(用于依赖管理和运行项目)

项目要求使用 uv==0.13.0。请在仓库根目录运行以下命令;uv sync 会使用已提交的锁文件创建项目虚拟环境。

MCP 配置可移植性工作室

将一个带版本号且仅含密钥占位符的 MCP 连接意图,渲染为暂存的 Codex、Claude Code、Claude Desktop 或 VS Code 配置,并接收明确的语义损失/扩展报告:

uv run --frozen --extra dev mcp-trust portability validate \
  tests/fixtures/portability/local-stdio.json
uv run --frozen --extra dev mcp-trust portability round-trip \
  tests/fixtures/portability/local-stdio.json --host codex

该工作室仅在本地运行。它不会发现或编辑真实的主机配置、 启动 MCP 服务、联系 URL,也不会输出建模的密钥值。生成的 配置仅证明与有文档记录的主机格式兼容,不代表运行时连接或已采用。请参阅 docs/MCP-CONFIG-PORTABILITY-STUDIO.md。

工作原理

register a server  ->  scan via engine  ->  derive grade  ->  persist  ->  serve at a stable URL

该注册表不会重新实现漏洞检测。它负责协调可插拔的扫描引擎——随附的后端封装了公开的 mcp-audits (>=2.7.0,<3) 软件包——并负责管理 目录、公开信任等级的规范化、持久化和查询 API。

快速入门

git clone https://github.com/saagpatel/mcp-trust.git
cd mcp-trust
uv sync --frozen --extra dev

demo_dir="$(mktemp -d)"
uv run --no-sync mcp-trust seed --db "$demo_dir/registry.db"
env -u MCP_TRUST_RECEIPTS_DIR uv run --no-sync mcp-trust scan \
  mcp-reference-time --engine stub --db "$demo_dir/registry.db"
uv run --no-sync mcp-trust check mcp-reference-time --db "$demo_dir/registry.db"

安装依赖项后,此演示只会使用一个新建的临时 SQLite 数据库和显式指定的 StubEngine;它不会启动目录服务,且其 等级为演示数据。--db 可避免使用默认数据库及任何操作员设置的 MCP_TRUST_DB 覆盖值;清除 MCP_TRUST_RECEIPTS_DIR 可避免写入操作员的 收据目录。

若要通过本地 API 查看此演示,可以选择启动一个仅绑定环回接口的只读服务, 并在完成后按 Ctrl-C 将其停止:

MCP_TRUST_ENGINE=stub MCP_TRUST_PUBLIC_READONLY=1 \
  MCP_TRUST_MASKED_GRADES="$PWD/masked-grades.json" \
  uv run --no-sync mcp-trust serve --db "$demo_dir/registry.db" \
    --host 127.0.0.1 --port 8000

真实引擎扫描需要单独准备的 [engine] 环境、 经审核的目标、沙箱决策,以及操作员运行手册中当前的资质认定/预检证据。此类扫描可能启动 服务进程或联系远程端点,不属于此本地演示 和常规验证的范围。有关固定样例检查,请参阅本地开发和验证。

API

方法路径用途
GET/网页 -- 公共目录页面(每个服务的等级 + 透明度)
GET/ui/servers/{slug}网页 -- 服务详情页面 + README 徽章嵌入代码片段
GET/healthz存活状态
GET/servers目录 + 每个服务的最新等级、来源信息和过期状态(JSON)
GET/servers/{slug}完整的最新扫描记录 + 来源信息、过期状态和元数据(JSON)
POST/servers/{slug}/scan由运营人员触发扫描;公共部署会禁用此路由
GET/servers/{slug}/badge.json与 shields.io 兼容的 README 徽章

每个服务都有两个相互独立的信号:危险等级(A-F)和 透明度级别(高/中/低,依据注释覆盖率)。自动生成的等级并非对服务的背书、 认证,也不代表声称服务具有恶意行为。低透明度服务的低等级意味着“无法验证其安全性”, 而非“已知危险”。

默认情况下,HTTP 扫描触发采用失败关闭策略。公共部署应设置 MCP_TRUST_PUBLIC_READONLY=1,使 POST /servers/{slug}/scan 在任何引擎运行前返回 403。运营人员通常应通过 CLI 对持久化注册表数据库执行扫描,而非通过公共流量触发扫描。

使用确定性的 StubEngine 进行本地 API 演示时,请设置 MCP_TRUST_ALLOW_UNAUTHENTICATED_STUB_SCANS=1。在公共环境中不要设置此项。 私有运营人员界面仍可通过令牌门控触发 API 扫描:设置 MCP_TRUST_SCAN_TOKEN,并将其作为 Authorization: Bearer <token> 或 X-MCP-Trust-Scan-Token 传入。

如果最新存储的扫描记录行不可读,API、网页、静态页面、徽章和 快照投影都会失败关闭并返回 UNKNOWN;它们绝不会恢复使用较早的 等级。存储的来源/风险/发现项/证据 JSON 每个字段的准入上限为 1 MiB,且发现项/工具集合有数量限制,并提供不含内容的诊断信息。 较早的记录行不可读时,可读的最新等级仍会保留,但扫描 历史记录和等级变化声明会明确标为 UNKNOWN。修复或处置不可读的历史记录之前, 快照构建会停止。

所有公共界面使用统一的失败关闭新鲜度投影。扫描后恰好 90 天仍为 FRESH; 之后的任何时刻均为 STALE。缺失、格式错误或时间在未来的扫描时间会标为 UNKNOWN, 并隐藏判定字段。未扫描的条目为 NOT_APPLICABLE。即使不存在扫描记录,运营人员屏蔽设置仍会生效,且绝不会根据扫描状态推断该设置。静态页面和徽章是不可变的历史证据,并附有扫描日期或有效期边界;它们不承诺在请求时仍然是最新的。危险性、透明度和证据质量仍是相互独立的信号,等级绝不是背书。

在真实扫描运行期间设置 MCP_TRUST_RECEIPTS_DIR=/data/mcp-trust/receipts,以便 为每次扫描存档一份 JSON 回执,并将其可移植的制品文件名存入 report_ref。

远程授权元数据预检

Remote Registry 候选项可以在不联系 MCP 端点或处理凭据的情况下,检查是否存在可发现的 MCP 授权元数据。首先,根据之前保存的官方 Registry 响应生成候选清单,然后选择一个确切的 stable_id:

uv run python scripts/plan_registry_corpus.py \
  --input path/to/saved-registry-response.json > /tmp/registry-candidates.json

uv run mcp-trust auth-posture com.example/[email protected] \
  --manifest /tmp/registry-candidates.json \
  --pretty

如果已通过单独的操作员工作流获取公开的 WWW-Authenticate: Bearer 挑战,请使用 --www-authenticate 传入其值。否则,该命令会先尝试 MCP 要求的受保护资源 well-known 路径,然后按规范顺序尝试 RFC 8414 和 OpenID Connect 授权服务器发现。

该命令会输出 McpAuthorizationPostureV1 JSON。退出码为 0 且 state=metadata-ready 仅表示至少有一个授权服务器公开了策略审查所需的端点和 PKCE S256 元数据。这并不能证明已获得授权、凭据可用、运行时安全、符合扫描条件或具有信任等级。未知或无效的证据会以退出码 1 结束,并保持阻止状态;本地清单绑定无效则以退出码 2 结束。

网络边界刻意保持狭窄:仅允许 HTTPS 元数据 GET 请求,不使用环境代理、重定向或凭据,不建立端点会话,也不执行写入。每个请求只解析一次 DNS;所有解析结果都必须可在全球范围内路由,并且连接会固定到经接受的地址,同时 TLS 验证和 SNI 仍绑定到原始主机名。响应正文有大小限制,会经过验证,输出中仅以字节数和 SHA-256 表示。成功的元数据响应还必须包含有效的 HTTP Date;声明的缓存有效期最多遵循 24 小时的策略上限,而缺失、日期在未来或已过期的源证据仍视为未知。实现依据包括 MCP 授权规范、RFC 9728、RFC 8414 和 OpenID Connect 发现。

可复用的 Web 发布回读

本仓库负责维护与语言无关的 WebReleaseReadbackV1 契约及其标准库参考验证器。使用者需提供明确的 HTTPS 源站和带版本的路由哨兵清单:

python scripts/web_release_readback.py \
  --manifest path/to/release-routes.json \
  --target-url https://preview.example.com \
  --pretty

该命令会向 stdout 输出一份结构化回执;如果任何状态、必需或禁止的哨兵、精确正文、摘要、正文大小限制、超时或重定向断言失败,则以非零状态码退出。它仅实现 GET 和 HEAD,不使用环境代理,不接受凭据,也不具备部署、别名、DNS、晋级或回滚能力。架构、确定性制品清单、版本策略和回滚边界位于 contracts/web-release-readback-v1/ 下。

所有者仓库还通过 deploy/web-release-readback.json 使用此契约。deploy/smoke-readonly.sh 会先输出共享路由回执,然后运行针对 Registry 的健康状况、API、徽章、便携式回执引用及拒绝扫描 POST 断言。这种自采用仅用于发布回读检查;它既不会部署,也不会更改别名。

此通用回执是增补项。在有证据证明回执等效性足以支持移除重复的 HTTP 断言代码之前,产品专属的 API、徽章、隐私、发布沿袭和拒绝变更检查仍由各使用者负责。

证据沿袭决策

EvidenceLineageLedgerV1 是一份仅包含元数据、默认拒绝的合约,用于 MCP 语料库的准入、刷新、发布和撤回决策。它绑定精确身份、摘要、可移植的凭证引用、新鲜度、权利证据、公开投影、替代关系和保留期限,而不存储原始日志或机密信息。只读评估器要求明确的观测时间,并生成稳定的原因代码;只有明确的 ALLOWED 状态才能授权准入或发布。

有关架构、决策语义、包含三条记录的打包目录试点、声明上限和回滚边界,请参阅 docs/EVIDENCE-LINEAGE-LEDGER-V1.md。此源能力本身不会迁移目录、发布或撤回记录、运行扫描,也不会更改部署状态。

手动刷新候选项

首先生成不执行操作的清单、精确的源代码/工具/镜像预检,以及确定性的重复样本凭证:

运行时刷新命令要求单独准备冻结的 [engine] 环境。它们使用该环境中的精确解释器,并且不会在预检或创建候选项的过程中安装依赖项:

PYTHON=./.venv/bin/python
test -x "$PYTHON"

"$PYTHON" scripts/grade_refresh.py engine-materialization \
  --repo-root "$PWD" \
  --out ./dist/grade-refresh/engine-materialization.json
"$PYTHON" scripts/grade_refresh.py inventory \
  --out ./dist/grade-refresh/inventory.json
"$PYTHON" scripts/grade_refresh.py host-capacity \
  --anchor "$PWD" \
  --out ./dist/grade-refresh/host-capacity.json

# Stop unless the two-reading receipt is READY. Start the separately approved
# Colima instance only after this point, then create the bound preflight.
"$PYTHON" scripts/grade_refresh.py preflight \
  --repo-root "$PWD" \
  --engine-materialization ./dist/grade-refresh/engine-materialization.json \
  --host-capacity ./dist/grade-refresh/host-capacity.json \
  --out ./dist/grade-refresh/preflight.json
uv run --frozen --extra dev python scripts/grade_refresh.py fixture-repeat \
  --out ./dist/grade-refresh/fixture-repeatability.json

容量凭证要求至少有 5 GiB 可用空间,且两次读数间隔至少 30 秒、容量均低于 100%。在执行 Docker、MCP 或注册表数据库操作前会重新验证;凭证在 120 秒后过期,并绑定主机文件系统设备,而不会记录主机路径。源合约本身无法证明操作员在凭证通过前一直保持 Colima 停止状态,也无法针对同一用户的替换操作验证观测结果;如果没有单独密封的操作员绑定,来源信息仍为 UNKNOWN。 离线镜像资格认定要求每次调用都使用一份新观测、限定到对应批次的凭证。凭证集合只增不减;五个批次都使用同一个新的、经审核的集合名称,但绝不可在不同批次间重复使用容量凭证:

: "${MCP_TRUST_QUALIFICATION_RECEIPT_SET:?set a new reviewed task-owned receipt-set name}"
for cohort in reference live-batch batch3 batch4 basic-memory; do
  uv run --frozen python scripts/grade_refresh.py qualification-capacity \
    --operation qualification \
    --receipt-set "${MCP_TRUST_QUALIFICATION_RECEIPT_SET}" \
    --cohort "$cohort" \
    --out "./dist/grade-refresh/qualification-capacity-$cohort.json"
  uv run --frozen python scripts/qualify_refresh_images.py \
    --cohort "$cohort" \
    --host-capacity "./dist/grade-refresh/qualification-capacity-$cohort.json" \
    --receipt-set "${MCP_TRUST_QUALIFICATION_RECEIPT_SET}"
done

src/mcp_trust/catalog/refresh_policy.json 中精确指定的五个 qualification_receipt 路径具有权威性;文档中的版本标签永远不具权威性。 限定器会创建不可变的源/输入绑定集合清单,并在首次 Docker 变更前写入悲观的仅追加尝试意图。每次启动 Docker 或 Buildx 子进程前,它都会重新验证绑定回执,且绝不续期。如果容量到期或倒退,则不会生成资格验证回执,意图也会保持未解决状态,因此 Docker 状态和资格验证状态均为 UNKNOWN。重试该批次前,请使用 --operation cleanup 签发新回执,并使用 --cleanup-cohort "$cohort" 运行限定器;清理操作仅针对精确记录的标签和输出,并且必须追加一份成功的回读回执。缺少不可变清单的现有集合、未知构件、被覆盖的回执,以及源或输入漂移都会被拒绝。成功构建会追加资格验证完成绑定;只有中断的尝试才需要清理完成记录。资格验证清单会将其起始修订版保留为溯源信息,但会依据资格验证专用摘要映射重新打开。该映射包含限定器及其运行时模块、Dockerfile、依赖输入、锁文件、构件描述符和嵌套的源构建证据。生成的 docker/refresh/qualification/ 证据和 refresh_policy.json 回执指针属于采纳元数据,因此跟踪它们不会导致已完成集合自我失效;每次构建前都会依据描述符摘要独立重新验证依赖包字节,而回执和图完整性仍必须独立满足。 任何可执行文件或构建输入的漂移仍会导致安全失败。每个集合的进程锁和唯一于每次尝试的临时标签,可防止并发资格验证共享变更状态。中断清理仅移除意图中记录的 OCI、验证回执和摘要绑定的工具快照残留。它绝不会重写最终标签:回读必须显示记录的基线或任务独占的精确镜像 ID;任何其他值都视为有歧义,并会被阻止。 只有预检返回 READY,才能执行目录服务器。该回执绑定 31 项分类,包括精确推导出的 22 项可扫描和 9 项阻止执行边界、源和策略摘要、工具版本、本地 Docker 权限、不可变镜像 ID,以及明确的网络、文件系统、资源和机密控制。请参阅 docs/GRADE-REFRESH-PROGRAM.md 和 操作员运行手册。

创建评审候选项,但不更改规范注册表、烘焙快照、静态站点、计划或部署:

"$PYTHON" scripts/refresh_candidate.py create \
  --db ./registry.db \
  --out-dir ./dist/refresh-candidates \
  --qualification-receipt ./dist/grade-refresh/preflight.json

只有在绑定的预检回执仍有效且状态为 READY,并且 Docker 和每个由目录固定的镜像都已在本地以记录的不可变 ID 提供时,该命令才会执行本地进程扫描。这些源会在现有的禁用网络、只读、移除能力并限制资源的沙箱中运行。每个本地容器都会预先创建,且连接器被绑定为仅启动该不可变 ID;只有绑定的守护进程证明容器已不存在后,才会接受扫描证据。若超时后没有此类回读,状态仍为 UNKNOWN。远程端点会通过其实际网络传输进行探测,不使用本地进程沙箱,并会据此标记。新的不可变包使用 RefreshCandidateV2,包含自带摘要的执行绑定回执、目录身份、扫描时间和扫描年龄、受阻/屏蔽/失败/超时/未知证据状态、归因的扫描漂移、如实的静态快照、源/工具绑定、新鲜度计数和最早过期时间、语义投影摘要,以及内容绑定清单。旧版 V1 包在结构上仍可检查,但不具备发布资格。 候选项创建不具备发布或部署权限。结构验证会分别报告架构有效性和发布资格;有效的 V1 工件不能通过自我声明获得 V2 权限。当前、完整且绑定经审核输入的 V2 候选项,只能作为后续本地准入的输入。资格绝不会授予批准、发布、部署、回滚、调度或联络权限。

可以验证单独提供的 McpTrustPublicationApprovalV1,并用它构建确定性的本地只读副本包:

uv run --frozen python scripts/build_publication_package.py \
  --verify-approval ./dist/publication-approval.json \
  --candidate ./dist/site-candidates/<name>
uv run --frozen python scripts/build_publication_package.py --build \
  --candidate ./dist/site-candidates/<name> \
  --approval ./dist/publication-approval.json \
  --out ./dist/publication-packages/<name>
uv run --frozen python scripts/build_publication_package.py \
  --verify-package ./dist/publication-packages/<name> \
  --approval ./dist/publication-approval.json

此准入过程无需供应方参与,且仅在本地进行。它绑定 V2 候选项、可重复性和分诊溯源、确切的 V38 审核、当前供应方证据、回滚目标、操作员声明摘要以及最短有效期。所有变更权限仍为 false。软件包不代表部署权限、发布证明、回滚权限、调度器权限、背书或生产时效性证据。

手动静态部署通道需要单独的短期 McpTrustProductionDeployAuthorizationV4 绑定,该绑定需关联确切的软件包、内容批准、供应方和操作员回执、保留的回滚字节、源代码修订版本、输出和工具摘要。它会在实时 TTY 确认前后重新验证。任何供应方调用后,时效性仍为 UNKNOWN,直至供应方和源代码绑定的 McpTrustProductionPublicationReceiptV1 验证确切的全路由回读回执。缺失的供应方工件摘要绝不能提升为 FRESH。

快照签名是在候选项批准/暂存之后的独立权限。刷新流程永远不会获得签名密钥或恢复密钥,其 SHA-256 清单也不是发布者身份。在操作员根据离线信任契约选择根密钥、保管机制、阈值、发布计数器和检查点所有者之前,生产签名仍处于禁用状态。

状态

技术栈

该项目使用 Python、FastAPI、SQLite、Typer、Pydantic、作为可选扫描引擎的 mcp-audits、Ruff、Pyright 和 pytest。依赖项版本已锁定在 uv.lock 中;该项目需要 Python 3.12 或更高版本。

已知风险

目前已在 mcp-trust.vercel.app 上线,作为静态生成的目录,并根据本地注册表重新生成。捆绑的目录快照包含 23 条可见的真实 mcp-audits 评级;其中没有八条种子条目,包括目前由 masked-grades.json 隐藏的四条。捆绑快照将可见的本地进程评级的网络和沙箱来源标记为未知;只有经过回执验证的刷新候选项才能声称执行时未联网。每条评级都标注了来源,因此演示/存根数据绝不会被误认为真实扫描结果,未扫描的服务也不会显示字母评级。当前生产部署是包含 31 个服务的静态目录;自 2026-07-11 起,评级均为静态数据。当周重新扫描通道已停用,且部署权限已移除(参见 docs/CAPABILITY-RULING-2026-07-10.md)。

静态入口是低运维的启动路径(参见 DEPLOY-VERCEL.md);deploy/launchd/ 下的每周 launchd 任务已持续停用,当前主机回读结果显示其已卸载。一个休眠的已安装 plist 仍然存在,且与仓库模板不一致;应将其视为配置漂移,不要加载或启用它。兼容入口只能在执行前预检之后创建本地审核候选项;它不能发布或部署。作为替代方案,文档 DEPLOY-VM.md 仍介绍了在线 FastAPI 服务和 VM 路径。完整契约参见 SPEC.md,启动历史参见 LAUNCH-GATE.md。已部署的目录以扫描时间戳作为新鲜度依据;静态 HTML 不声称能够证明机器本地的调度器状态。

因此,已部署的目录可能过时。在线 URL 的响应可能来自缓存;本仓库说明无法验证当前目录内容的新近程度。静态 HTML 的新鲜度不能证明当前调度器状态,本地测试也无法确认在线提供方或部署行为。本仓库说明同样无法验证当前 GitHub Actions 状态。

在这台 macOS 主机上,Python 3.15.0 需要从源码构建已锁定的 pydantic-core 2.46.4;构建已完成,但其扩展加载失败。完整的 Python 3.15 CI 结果尚未验证。支持的 CI 矩阵仍为 3.12 至 3.15,等待该托管检查完成。

后续步骤

贡献

为确保在不同环境中可复现安装,仓库有意提交了 uv.lock。添加或更新依赖项时,请将更新后的 uv.lock 与 pyproject.toml 的更改一并提交。

运行 make setup 安装冻结的开发依赖项,并运行 make check 执行本地综合检查。

本地开发与验证

在仓库根目录运行 make setup。这与 CI 使用相同的核心/开发环境;它不会安装可选的真实扫描引擎。准备一个使用临时数据库且未设置操作员扫描/收据覆盖项的开发 Shell:

verification_dir="$(mktemp -d)"
export MCP_TRUST_DB="$verification_dir/registry.db"
export MCP_TRUST_ENGINE=stub
export MCP_TRUST_PUBLIC_READONLY=0
unset MCP_TRUST_MASKED_GRADES MCP_TRUST_RECEIPTS_DIR \
  MCP_TRUST_RUN_INTEGRATION MCP_TRUST_RUN_DOCKER_RUNTIME_READBACK

# Focused CLI/API fixtures; choose the test file or node for your changed module.
uv run --no-sync pytest -q tests/test_cli.py tests/test_api.py
# Aggregate deterministic local gate, as used by CI.
make check

测试夹具使用临时数据,并模拟运行时/提供方边界。两个集成测试选项都应保持未设置:MCP_TRUST_RUN_INTEGRATION=1 会启动真实的 MCP 服务,而 MCP_TRUST_RUN_DOCKER_RUNTIME_READBACK=1 会使用 Docker。这些检查需要单独的操作员授权和前置条件;它们不属于常规检查门槛。完整测试套件包含 POSIX 伪终端测试;如果本地平台无法提供伪终端,请使用 Ubuntu CI 运行器。对于负载较高的机器,MCP_TRUST_TEST_TTY_TIMEOUT 可调整这些测试的子进程时限,而不会降低断言要求。

make check 会运行 Ruff lint 和格式检查、Pyright、pytest 以及软件包构建。对于 Web/静态资源/徽章相关改动,请重点运行 tests/test_web.py、tests/test_site_generator.py、tests/test_build_site_script.py 和 tests/test_api.py,然后在交付前运行更全面的检查门槛。

当 HTML、布局、导航或展示的信任声明发生变化时,还应在本地浏览器中检查桌面宽度和窄屏宽度下的预览。使用明确的临时路径和脚本的纯存根演示模式构建:

uv run --no-sync python scripts/build_site.py \
  --db "$verification_dir/preview.db" --out "$verification_dir/site" \
  --demo-fill --base-url http://127.0.0.1:8765
uv run --no-sync python -m http.server 8765 --bind 127.0.0.1 \
  --directory "$verification_dir/site"

打开 http://127.0.0.1:8765,并检查目录、一个详情页、导航、演示/来源标签、脱敏等级和徽章内容。按 Ctrl-C 停止预览。此开发构建只会写入临时演示数据和页面;它不是可发布的候选版本。仅当用户可见行为发生变化时才需要进行浏览器检查,纯文档改动则不需要。API 和 Web/静态资源指南定义了必须在各界面保持一致的信任声明。本地测试夹具/构建/浏览器检查结果无法证明真实引擎、提供方、部署或生产环境的实际情况。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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