Pre-alpha 文档
通过 MCP 发布并激活受完整 Manifest 约束的 Agent Skill。
使用 Final SEP-2640 静态 Server 与 Client/Host Profile,以不可变 Manifest、Origin-scoped 审批、延迟校验读取与显式执行门禁为边界。
所有响应共享同一份不可变快照
Server 在启动时冻结每个 SKILL.md 与 Supporting File。
skills/list、skills/get 和
resources/read 使用相同字节,因此 Manifest 不会与后续返回内容发生漂移。
| 边界 | 保证 |
|---|---|
| Discovery | 有界分页、确定顺序、TTL 与 Cache Scope。 |
| Manifest | 每个文件恰好出现一次,携带原始字节 SHA-256 与 Size。 |
| Read | 从保留的不可变快照返回 Text 或 Base64 Content。 |
| Policy | Authentication、精确 Scope 与动态 Authorization 早于存在性披露。 |
| Limit | 单个 Skill 最多 512 文件与 16 MiB,并有 Aggregate Catalog Ceiling。 |
| Host | Origin + URI 身份、先审批后读取、Digest/Size/Frontmatter 精确校验、持久化 Scoped Acting Window、精确恢复、不可变撤销与 Manifest-only 延迟访问。 |
| Execution | 精确绑定 Owner/Version/完整 Descriptor,并在每次执行与恢复核对前 获取绑定 Acting Window、精确持久执行关联与有界 Schema-bound Input 的全新 Policy Permit;每个新的不含 Payload Receipt 都会在 Provider I/O 前与撤销串行化并校验有效 Window;后续撤销不会追回已经提交的授权。 |
通过 Verification-first Host 激活
let client = McpClient::connect(
endpoint,
McpClientIdentity::new("orders-agent", env!("CARGO_PKG_VERSION"))?,
authorization,
McpClientOptions::for_skills(),
).await?;
let host = McpSkillHost::new(
client,
McpSkillOrigin::new("production/orders-mcp")?,
SkillActivationScope::new(tenant_id, run_id, thread_id),
Arc::new(application_skill_policy),
Arc::new(postgres_store.clone()),
McpSkillHostOptions::default(),
)?;
let catalog = host.list_skills().await?;
let selected = catalog.find_uri("skill://code-review/SKILL.md")
.ok_or(AppError::SkillUnavailable)?;
let activation = McpSkillActivationAttempt::generate();
let active = Arc::new(host.activate(selected, activation).await?);
let file = active.read_file("references/checklist.md").await?;
model_context.push_untrusted_skill_file(file.identity(), file.bytes())?;
let guarded = Arc::new(McpSkillBoundTool::new(
Arc::clone(&active),
ticket_create_tool,
Arc::new(postgres_store.clone()),
McpSkillHostCodeExecution::NotPossible,
)?);
tool_registry.register(guarded)?;
let tools = tool_registry.build();
Listing 不会预取 Skill 文件。请在 Model-visible Context
中保留每个已校验文件的 Origin Identity。请注册
McpSkillBoundTool 而不是 Raw Provider,使普通持久 Tool Runtime
在执行与恢复核对前强制执行精确 Policy Decision。Frontmatter
allowed-tools 只是 Policy 的对照输入,永远不会自动授权。 Policy
必须返回固定版本的 Activation 与逐次 Operation Grant Evidence;Window Store
或 Durable Receipt Sink 不可用,或 Evidence 已过期、撤销、越界时,都会在 Dispatch
前失败关闭。
在启动阶段拒绝歧义与危险 Package
Registry 会拒绝任意层级的 YAML 重复 Key、非法 Agent Skills Field、超过物化 Value 预算的 Alias 展开、Name/URI 不一致、Traversal 与非规范 Path、重叠 Resource URI、不完整 Package 和超限 Catalog。未知 Frontmatter Field 会被保留为 Data,但不会成为 Authority。
构建静态 Server Surface
let skill = McpServerSkillDefinition::new(
"skill://code-review/SKILL.md",
[
McpServerSkillFile::text(
"SKILL.md",
"text/markdown",
include_str!("skills/code-review/SKILL.md"),
)?,
McpServerSkillFile::text(
"references/checklist.md",
"text/markdown",
include_str!("skills/code-review/references/checklist.md"),
)?,
],
)?;
let mut skills = McpServerSkillCatalogBuilder::default();
skills.register(skill)?;
let app = McpServerApplicationBuilder::new(options)
.with_skills(skills.build()?, skill_authorization)?
.build()?; 请让 Skill Byte 来自经过审查的部署输入,不要在 Request Path 中重建 Registry。
复现两个 Profile 的门禁
cargo test -p stateknot-integrations mcp_server_skill --locked
cargo test -p stateknot-integrations --test mcp_skills_server --locked
cargo test -p stateknot-integrations mcp_skill_host --locked
cargo test -p stateknot-integrations --test mcp_skills_host --locked
cargo test -p stateknot-store-postgres --test postgres --locked tool_authorization_receipts_are_exact_immutable_and_page_verifiable 完整实现与不声明边界见 Server 指南和Client/Host 指南。